Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 6
1

Проблема с кодировками при использовании Thunderbird 45.4.0

17.11.2016, 14:57. Просмотров 2292. Ответов 10
Метки нет (Все метки)


Приветствую.
У меня следующая проблемка с кодировками. Самая живая на мой взгляд тема и ближе всего к cmd + javascript. Сразу говорю ... писать на форум мозилы смысла не вижу ... т. к. в прошлый раз мне с этой темой никто не помог и в этот раз думаю тоже ... но тема таже самая (там все кратенько, загляните чисто для подробностей) https://forum.mozilla-russia.o... 57#p706457

После обновления с версии Thunderbird 38.5.1 на 45.4.0 перестала отрабатывать функция конвертации переменной определенной в windows в переменную javascript опеределенную в автоконфиге thunderbird.cfg.

Если кратко, я получаю ФИО пользователя из AD и запихиваю его в переменную %FULLNAME% в Windows:
Windows Batch file
1
for /f "Tokens=2*" %%m in ('net user %USERNAME% /domain ^| find "Полное имя"' ) do setx FULLNAME "%%n"
Потом с помощью функции в самом thunderbird.cfg на лету конвертирую в UTF-8 (без BOM) и поставляю в поле пользователя по умолчанию:

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
try {
 
        function utf8 (text) {
 
        var decoded_text;
        var first_byte,second_byte, first_byte_decoded, second_byte_decoded;
 
        decoded_text = "";
        for(var pos = 0; pos < text.length; pos++) {
            var c = text.charCodeAt(pos);
            if (c > 128) {
                first_byte = parseInt(c/256);
                second_byte = c % 256;
                first_byte_decoded = 192 + first_byte * 4 +
                    parseInt(second_byte/64);
                second_byte_decoded = 128 + second_byte % 64;
                decoded_text =decoded_text +
                    String.fromCharCode(first_byte_decoded) +
                    String.fromCharCode(second_byte_decoded);
            } else {
                decoded_text = decoded_text + String.fromCharCode(c);
            }
        }
        return decoded_text;
        }
 
var fullname = getenv("FULLNAME");
 
defaultPref("mail.identity.id1.fullName", utf8(fullname));
Имя подставляется и переменная существует, но вставляются кракозябры. Т. е. получается почему-то не отрабатывает функция перекодировки в UTF-8 (без BOM).

Перечитал кучу тем ... через BAT, я так понимаю, можно только создать файлик в кодировке UTF-8 (без BOM), но я не могу создать переменную в кодировке UTF-8 (без BOM), например, %FULLNAME_UTF8%. Единственный вариант, который, я думаю, можно реализовать с моими способностями, это создать файлик с правильной кодировкой и положить его куда-нибудь рядом с профилем пользователя и его уже указать в качестве переменно javascript, но не хотелосьбы лишних костылей.

Может кто что подскажет?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2016, 14:57
Ответы с готовыми решениями:

проблема с кодировками при выводе из БД
подскажите ПЛЗ, что делать. вывожу русскоязычные данные из Access базы и они сыпятся знаками...

проблема с кодировками при вставке содержимого файла
Прошу не пинать ногами, если такой вопрос был, я не нашел. Есть Asp-скрипт. В нем есть такая...

Проблема с кодировками
Установил Nuked Klan на сервер, и взялся его переводить (движок французский). Большинство модулей...

Проблема с кодировками в Ajax
вообщем есть такой урезанный код: &lt;DIV id='div'&gt;&lt;/DIV&gt; &lt;SCRIPT language=&quot;JavaScript&quot;&gt; ...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы DevOps-инженеров
10
Эксперт WindowsАвтор FAQ
17601 / 7444 / 884
Регистрация: 25.12.2011
Сообщений: 11,236
Записей в блоге: 16
17.11.2016, 17:01 2
fullname - в какой кодировке? Распечатывать пробовали? что там видно? Может, она уже исходно в UTF-8?

Цитата Сообщение от AlektroNik Посмотреть сообщение
Имя подставляется и переменная существует, но вставляются кракозябры.
Крякозяблики покажите?

Вам только javascript код походит или jscript тоже? (намекаю на использование объектов ActiveXObject, как в первом посте темы "Перекодировка текста (сборник кодов для различных кодовых страниц)", спойлер "Любая кодировка в любую")

Добавлено через 1 минуту
Цитата Сообщение от AlektroNik Посмотреть сообщение
через BAT, я так понимаю, можно только создать файлик в кодировке UTF-8 (без BOM)
ну можно и так. Создать, потом прочитать его. Но лучше так не делать, сразу через jscript.
0
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 6
17.11.2016, 17:21  [ТС] 3
Цитата Сообщение от Dragokas Посмотреть сообщение
Вам только javascript код походит или jscript тоже?
По-моему только javascript.

Цитата Сообщение от Dragokas Посмотреть сообщение
Крякозяблики покажите?
Проблема с кодировками при использовании Thunderbird 45.4.0
0
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 6
17.11.2016, 17:45  [ТС] 4
Добавлено через 10 минут
Цитата Сообщение от Dragokas Посмотреть сообщение
Любая кодировка в любую
А разве там не нужен именно файл на входе и на выходе?
Или вы предлагаете взять thunderbird.cfg перекодировать его в 866 потом записать в него параметр (опять же парсить, менять), потом конвертнуть его уже в 65001 (UTF-8 (без BOM)). В таком случае проще отдельно файлик с ФИО положить, а то как-то корявенько получается.
0
Эксперт WindowsАвтор FAQ
17601 / 7444 / 884
Регистрация: 25.12.2011
Сообщений: 11,236
Записей в блоге: 16
17.11.2016, 17:53 5
Лучший ответ Сообщение было отмечено ComSpec как решение

Решение

В виде текста, а не скриншотом.
Ну да ладно. Вижу, что UTF8 -> Latin.

Так пробовали?
Код
defaultPref("mail.identity.id1.fullName", fullname);
Добавлено через 2 минуты
Цитата Сообщение от AlektroNik Посмотреть сообщение
А разве там не нужен именно файл на входе и на выходе?
в том примере нужен. Но поток можно загрузить и виде массива.
Цитата Сообщение от AlektroNik Посмотреть сообщение
Или вы предлагаете взять thunderbird.cfg перекодировать его в 866 потом записать в него параметр
ничего такого я не предлагал.
1
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 6
17.11.2016, 18:12  [ТС] 6
Цитата Сообщение от Dragokas Посмотреть сообщение
defaultPref("mail.identity.id1.fullName", fullname);
Обалдеть, прокатило. Удалил целиком функцию function utf8 (text) для чистоты эксперемента и отредактировал как Вы сказали. Похоже Thunderbird что-то у себя подкрутил и теперь костыль в виде функции не требуется Целый день убил сегодня на это.
Спасибо, что уделили время. Знал, что на Вас можно положиться

А может на последок подскажите, как узнать в какой кодировке у меня хранится переменная в Windows? Или как так получилось? Может это и не Thunderbird поправил, а просто у меня переменные одинаково называются FULLNAME и fullname, и javascript каким-то образом переписал значение в Windows. Т. е. как Вы пришли к такому выводу?
echo %FULLNAME%
0
Эксперт WindowsАвтор FAQ
17601 / 7444 / 884
Регистрация: 25.12.2011
Сообщений: 11,236
Записей в блоге: 16
17.11.2016, 18:31 7
Цитата Сообщение от AlektroNik Посмотреть сообщение
Т. е. как Вы пришли к такому выводу?
Вот так:
Проблема с кодировками при использовании Thunderbird 45.4.0


Цитата Сообщение от AlektroNik Посмотреть сообщение
в какой кодировке у меня хранится переменная в Windows?
Начать с процедуры её генерации, переписав так:
Windows Batch file
1
for /f "Tokens=2*" %%m in ('net user %USERNAME% /domain ^| find "Полное имя"' ) do echo %%n>name.txt
Выполнить. Потом открыть файл name.txt блокнотом Windows, если иероглифов нет, нажать Файл -> Сохранить как... и внизу посмотреть какая кодировка.
Это поможет, если в тексте будет хоть один знак кириллицы.
Вообще, в ANSI (cp-1251), но хз, у Windows 8/10 часть CMD команд выдают юникод, так что по-разному может быть в разных версиях ОС.
0
Эксперт WindowsАвтор FAQ
17601 / 7444 / 884
Регистрация: 25.12.2011
Сообщений: 11,236
Записей в блоге: 16
17.11.2016, 19:18 8
Цитата Сообщение от AlektroNik Посмотреть сообщение
Может это и не Thunderbird поправил
Думаю, что это из-за того что после обновления слетели некоторые настройки, в частности стандартная кодировка при составлении письма:

Javascript
1
user_pref("prefs.converted-to-utf8", true);
Проверьте, есть ли такая строка в файле настроек. Если нет, добавить.
0
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 6
17.11.2016, 20:32  [ТС] 9
Цитата Сообщение от Dragokas Посмотреть сообщение
user_pref("prefs.converted-to-utf8", true);
Такой настройки у меня нет ни в файлике автоконфигурации thunderbird.cfg, который лежит рядом с thunderbird.EXE ни в папке профиля пользователя C:\Users\user\AppData\Roaming\Thunderbird\Profiles\g6e7ec0b. default\prefs.js, который переопределяет параметры автоконфига thunderbird.cfg. Его добавление ничего не меняет ни в true ни в false. Пробовал конвертировать файл prefs.js через Notepad++ в ANSI думал может автоматом переконвертирует весь файл - нет, вбивал в кодировке ANSI ФИО ("Имя отправителя") , думал будет конвертировать автоматом ФИО ("Имя отправителя") в UTF8 - нет, просто пустое поле показвал. Проверял формат создаваемых новых сообщений кодировку, всегда "Юникод" стоит. И кучу других тестов, но нигде не нашел как же этот параметр работает и за что конкретно отвечает.
Если Вас не затруднит, ткныте носом в пример, что же должно менятся когда этот параметр включен или выключен?

Теперь по поводу ФИО ("Имя отправителя") и моих экспериментов. Я поторопился радоваться, но направления было верным.
Опишу подробно мои тесты. Сразу хочу обратить внимание нужна обязательная перезагрузка машинки, т. к. именно после перезагрузки все и слетало на нет. Вобщем для чистоты эксперемента ребут обязателен в моем случае.

Исходный конфиг:

Кликните здесь для просмотра всего текста
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function utf8 (text) {
 
        var decoded_text;
        var first_byte,second_byte, first_byte_decoded, second_byte_decoded;
 
        decoded_text = "";
        for(var pos = 0; pos < text.length; pos++) {
            var c = text.charCodeAt(pos);
            if (c > 128) {
                first_byte = parseInt(c/256);
                second_byte = c % 256;
                first_byte_decoded = 192 + first_byte * 4 +
                    parseInt(second_byte/64);
                second_byte_decoded = 128 + second_byte % 64;
                decoded_text =decoded_text +
                    String.fromCharCode(first_byte_decoded) +
                    String.fromCharCode(second_byte_decoded);
            } else {
                decoded_text = decoded_text + String.fromCharCode(c);
            }
        }
        return decoded_text;
        }
 
var fullname = getenv("FULLNAME");
 
defaultPref("mail.identity.id1.fullName", utf8(fullname));


Тест 1
Редактирую строчку, убираю ТОЛЬКО вызов функции utf8. Перезагружась.
Кликните здесь для просмотра всего текста
было
Javascript
1
defaultPref("mail.identity.id1.fullName", utf8(fullname));
стало
Javascript
1
defaultPref("mail.identity.id1.fullName", fullname);

Получаю корректное отображение ФИО ("Имя отправителя") в Thunderbird.


Тест 2
Решаю убрать и саму функцию utf8. По логике, если я ее не использую, зачем она мне в конфиге. Перезагружаюсь.
Кликните здесь для просмотра всего текста
было
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function utf8 (text) {
 
        var decoded_text;
        var first_byte,second_byte, first_byte_decoded, second_byte_decoded;
 
        decoded_text = "";
        for(var pos = 0; pos < text.length; pos++) {
            var c = text.charCodeAt(pos);
            if (c > 128) {
                first_byte = parseInt(c/256);
                second_byte = c % 256;
                first_byte_decoded = 192 + first_byte * 4 +
                    parseInt(second_byte/64);
                second_byte_decoded = 128 + second_byte % 64;
                decoded_text =decoded_text +
                    String.fromCharCode(first_byte_decoded) +
                    String.fromCharCode(second_byte_decoded);
            } else {
                decoded_text = decoded_text + String.fromCharCode(c);
            }
        }
        return decoded_text;
        }
 
var fullname = getenv("FULLNAME");
 
defaultPref("mail.identity.id1.fullName", fullname);
стало
Javascript
1
2
3
var fullname = getenv("FULLNAME");
 
defaultPref("mail.identity.id1.fullName", fullname);


Получаю тоже самое, что и при экспериментах с кодировкой и параметром user_pref("prefs.converted-to-utf8", true);, а именно пустоту в строке ФИО ("Имя отправителя") в Thunderbird.


ТЕСТ 3
Меняю переменную fullname на fullname_thunderbird, чтобы избежать некорректной обработки с переменной FULLNAME в Windows.
Кликните здесь для просмотра всего текста
было
Javascript
1
2
3
var fullname = getenv("FULLNAME");
 
defaultPref("mail.identity.id1.fullName", fullname);


Кликните здесь для просмотра всего текста
стало
Javascript
1
2
3
var fullname_thunderbird = getenv("FULLNAME");
 
defaultPref("mail.identity.id1.fullName", fullname_thunderbird);

Получаю корректное отображение ФИО ("Имя отправителя") в Thunderbird.


ИТОГ
1. Thunderbird как-то все-таки обрабатывает автоматом переменную в Windows и записывает к себе уже в формате utf-8, скорей всего в каком формате находится сам файл thunderbird.cfg, в током и происходит запись, не проверял. Кодировка по умолчанию в Windows 7 OEM 866, это неоднократно проверялось в скриптах.
2. Переменные всеже пересикались, странно что, долгое время все работало и почему-то с самого начала не сделал разные переменные.
3. Ну и итоговый конфиг ... для закрепления без всякий дополнительных функций вообще:
Javascript
1
2
3
var fullname_thunderbird = getenv("FULLNAME");
 
defaultPref("mail.identity.id1.fullName", fullname_thunderbird);
0
Эксперт WindowsАвтор FAQ
17601 / 7444 / 884
Регистрация: 25.12.2011
Сообщений: 11,236
Записей в блоге: 16
17.11.2016, 21:18 10
Цитата Сообщение от AlektroNik Посмотреть сообщение
Если Вас не затруднит, ткныте носом в пример, что же должно менятся когда этот параметр включен или выключен?
Я считаю, что при установке свойства converted-to-utf8 в true огненный лис должен был начать воспринимать свойства, влияющие на формирование письма, в формате utf-8, то есть должен был корректно обработать строку:
Javascript
1
defaultPref("mail.identity.id1.fullName", utf8(fullname));
Если это не так, значит есть ещё какая-то настройка кодировки. Я вот такую ещё встречал:
Код
user_pref("intl.charsetmenu.mailview.cache", "ISO-8859-1, UTF-8");
Попробуйте ещё перепроверить:
Tools → Options → Display → Formatting → Fonts → Advanced... → Character Encodings → Outgoing Mail:
Проблема с кодировками при использовании Thunderbird 45.4.0


Кстати, попробуйте заблокировать настройку такой командой:
Код
lockPref("prefs.converted-to-utf8", true);
Я ещё подумал, может быть происходит двойное кодирование в utf8? Проверьте, в какой кодировке у Вас сохранён файл скрипта? Если в UTF-8, попробуйте временно пересохранить в ANSI, а функцию utf8() не удаляйте из скрипта. Оставьте всё как было раньше.

На счёт потери настроек после перезагрузки, вот тут человек пишет что можно создать файл user.js, который будет иметь более высокий приоритет над prefs.js
0
0 / 0 / 0
Регистрация: 17.11.2016
Сообщений: 6
18.11.2016, 16:26  [ТС] 11
Цитата Сообщение от Dragokas Посмотреть сообщение
огненный лис должен
Огненный может и должен, а моя громовая птица не особо Специально проверил. Да и нет нужды теперь в той функции utf8, пашет без нее, так это замечательно, нет лишнего костыля.

Цитата Сообщение от Dragokas Посмотреть сообщение
Tools → Options → Display → Formatting → Fonts → Advanced... → Character Encodings → Outgoing Mail:
Исходящие UTF-8, Входящие Win-1251

Цитата Сообщение от Dragokas Посмотреть сообщение
lockPref("prefs.converted-to-utf8", true);
Нет смысла блокировать, я ее и так непосредственно под пользователем делаю.

Цитата Сообщение от Dragokas Посмотреть сообщение
может быть происходит двойное кодирование в utf8?
Может быть ...

Цитата Сообщение от Dragokas Посмотреть сообщение
в какой кодировке у Вас сохранён файл скрипта?
Файл скрипта, который ФИО получает в OEM 866, конфиги thunderbird в UTF-8 (без BOM).

Цитата Сообщение от Dragokas Посмотреть сообщение
На счёт потери настроек после перезагрузки
Ну у меня настройки не теряет ... я вроде такого не писал, а перезагрузка нужна для чистоты эксперемента, потомучто ФИО Выдергивается при входе ну и скинуть все возможные эксперементы.

Мы сейчас пытаемся заставить работать то, без чего и так все замечательно работает ... Про параметр prefs.converted-to-utf8 безусловно ценное замечание, но гадать на кофейной гуще и тратить время не ненужный эксперемент думаю не стоит. Видимо в почтовик встроили функцию конвертации UTF-8 просто из-за этого и происходил этот глюк у меня.

Не вижу смысла продолжать тесты, ОГРОМНОЕ спасибо за помощь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2016, 16:26

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

dbf - проблема с кодировками !!!
Есть 'база данных' - обычный файл dbf. Самое интересное, что я не знаю как он был создан(что за...

Запутанная проблема с кодировками
Попробую описать задачу: Есть веб-служба, которая по запросу берет некий xml, трансформирует...

Проблема с кодировкой при использовании процедур
Здравствуйте. Возникла проблема с кодировкой при использовании процедур. Сама база в utf8 и там уже...

Проблема с кодировками вставляемых файлов
Вставляю в Word текстовые файлы в DOS кодировке с помощью Selection.InsertFile ... Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.