У меня выход в Интернет происходит через прокси-сервер. На этом прокси-сервере стоит UserGate 2.8. Логины пользователей – это фамилии русскими буквами + инициалы. В UserGate настроена HTTP-авторизация.
  Проблема в том, что при выходе в Интернет выскакивает окно, в котором надо ввести логин и пароль доступа. Если логин содержит только английские буквы ни каких проблем, а если русские, то авторизация не происходит и окошко выскакивает еще раз.
  В IE все работает и английскими и с русскими буквами.

  Я пробовал ставить у себя UserGate v2.8, v4.0, v4.1 и проверял с помощью IE, FireFox v1.0, v1.5, v2.0b2. Результат один и тот же: в IE все работает, а в FireFox нет. :cry:
Что делать? Очень хочется пользоваться FireFox не только дома, но и на работе.

Ну что же, сам спросил, сам и отвечаю.

Все дело в переводе из Unicode16 в ASCII. После того как логин и пароль к прокси-серверу были введены FireFox перевод их в Unicode (он называет его UTF16). А перед отправлением на прокси-сервер переводит обратно в ASCII, но не верно!!! Он просто берет младшую часть Unicode! Для английских букв это не важно их Unicode имеет 0 в старшей части, а вот русские буквы превращаются в какую-то ерунду.

Пример преобразования букв ASCII->Unicode->ASCII

Char    ASCII        Unicode          ASCII
А     0xC0        0x0410           0x10
Б     0xC1        0x0411           0x11
В     0xC2        0x0412           0x12

A     0x41        0x0041           0x41
B     0x42        0x0042           0x42
C     0x43        0x0043           0x43

Для знатоков скажу, что это происходит в mozilla\netwerk\protocol\http\src\nsHttpBasicAuth.cpp

Функция называется nsHttpBasicAuth::GenerateCredentials

    // we work with ASCII around here
    nsCAutoString userpass;
   

LossyCopyUTF16toASCII

(user, userpass);
    userpass.Append(':'); // always send a ':' (see bug 129565)
    if (password)
       

LossyAppendUTF16toASCII

(password, userpass);

    // plbase64.h provides this worst-case output buffer size calculation.
    // use calloc, since PL_Base64Encode does not null terminate.
    *creds = (char *) calloc(6 + ((userpass.Length() + 2)/3)*4 + 1, 1);
    if (!*creds)
        return NS_ERROR_OUT_OF_MEMORY;

    memcpy(*creds, "Basic ", 6);
    PL_Base64Encode(userpass.get(), userpass.Length(), *creds + 6);

Как очевидно из названия функция преобразует с потерями.

Ну вот, ошибка найдена. Как мне теперь сообщить об этом разработчикам? Если учесть, что английский я очень плохо знаю, еле-еле читать получается.

Dima_0

Ну вот, ошибка найдена. Как мне теперь сообщить об этом разработчикам?

https://bugzilla.mozilla.org/enter_bug.cgi?product=Core