1

Тема: OFF: Кодировка текста

Имеется программа. При установке предлагает выбрать язык. Если выбрать английский, текст во всех пунктах меню GUI будет отображаться корректно. Если выбрать русский, получатся кракозябры. Текст берётся из файла языка, вот фрагмент файла RUSSIAN.XML:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<!--   Note_to_translators>Some symbols as "|" or "#RC#" or #AND# are important! Do no remove them Do not place any carrier return in the document. Those are simulated by #RC# symbol     -->
<Language_File_PhotocopierExpert_V700>
  <LANGUAGE>Русский</LANGUAGE>
  <WINDOWS>
    <FEN_BUG_REPORT>Bug</FEN_BUG_REPORT>
    <RETOUCHE>Редактировать картинку</RETOUCHE>
    <FEN_EMAIL>Отправить фотокопию по E-Mail</FEN_EMAIL>

Пробовал сохранять его в различных кодировках при помощи Word, не помогло.
В архиве прикрепил два файла языка и изображение.

2

Re: OFF: Кодировка текста

А в заголовке указание кодировки не влияет?

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>

3

Re: OFF: Кодировка текста

Не влияет, можно написать "blabla", получится то же самое.

4

Re: OFF: Кодировка текста

Возможно, в используемом шрифте нет русских букв.

5

Re: OFF: Кодировка текста

Может стоит попробовать подпатчить кодовую страницу 1252 на 1251 и в XML еще раз поиграться с charset ?


reg add "\HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Nls\CodePage" /v 1252 /f /t REG_SZ /d c_1251.nls
WBR. Roman

6

Re: OFF: Кодировка текста

Ранее была похожая проблема в программе Finale 2010 - кодировка текста в файлах, сохранённых в старой версии, воспринималась как Западноевропейская вместо Кириллицы. Там это решалось созданием правильного шаблона и правкой реестра:

CodePage_1251_full.reg пишет:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1250"="c_1251.nls"
"1252"="c_1251.nls"
"1253"="c_1251.nls"
"1254"="c_1251.nls"
"1255"="c_1251.nls"

Воспользовался этим файлом - заработало!

Rom5 пишет:

Может стоит попробовать подпатчить кодовую страницу 1252 на 1251 и в XML еще раз поиграться с charset ?


reg add "\HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Nls\CodePage" /v 1252 /f /t REG_SZ /d c_1251.nls

YMP, Rom5, благодарю за помощь! Правда, я так и не понял, в чём было дело. Программа использует шрифт, в котором нет русских символов или что-нибудь ещё?

7

Re: OFF: Кодировка текста

Судя по тому, что подмена в реестре сработала, прога использовала неправильную таблицу для перекодировки в Юникод. 1252 вместо 1251.

Что же они тёмные такие до сих пор? Программят и не знают о кодировках?

8

Re: OFF: Кодировка текста

ypppu пишет:

Ранее была похожая проблема в программе Finale 2010...

Ты пользуешься этой программой?

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

9

Re: OFF: Кодировка текста

Не я, мой знакомый. Мне пришлось в ней глубоко ковыряться, чтобы она правильно отображала русские буквы в файлах, созданных старой версией (кажись Finale 2008).

10

Re: OFF: Кодировка текста

ypppu пишет:

Не я, мой знакомый. Мне пришлось в ней глубоко ковыряться, чтобы она правильно отображала русские буквы в файлах, созданных старой версией (кажись Finale 2008).

Там можно просто в интерфейсе вручную перевыбирать набор символов для текстовых элементов. Благо, в партитурах русского текста, как правило, немного .

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

11

Re: OFF: Кодировка текста

Проблема в том, что придётся перелопачивать вручную каждый файл (а их много). Как раз в каждой партитуре много русского текста. Он имеет дело с оркестром и хором.

12

Re: OFF: Кодировка текста

YMP пишет:

Судя по тому, что подмена в реестре сработала, прога использовала неправильную таблицу для перекодировки в Юникод. 1252 вместо 1251.

Что же они тёмные такие до сих пор? Программят и не знают о кодировках?

То есть ошибка зашита в приложении, и без копания в операционной системе не решается?

13

Re: OFF: Кодировка текста

ypppu пишет:

То есть ошибка зашита в приложении, и без копания в операционной системе не решается?

По идее, можно где-то в программе заменить 1252 на 0 (дефолтная кодовая страница). Если они перекодируют через вызов MultiByteToWideChar, то найти вызов этой функции и заменить первый параметр. Т.е. пропатчить саму программу, и тогда манипуляции в реестре будут не нужны.

Кстати, а в Юникоде вы не пробовали файл сохранять? Или в UTF-8?

14

Re: OFF: Кодировка текста

Да, я сначала через Блокнот прогнал все варианты, потом через Word кириллицу.
Спасибо на ответ.

15

Re: OFF: Кодировка текста

А в самой программе есть настройка шрифтов? Тогда в стандартном диалоге выбора шрифтов можно попробовать указать кирилличесский набор символов. Впрочем, это может подействовать лишь до следуещего запуска программы. Тогда можно в том месте, где хранятся настройки программы (файл, реестр) вручную явно указать кириллический шрифт, т.е. после названия шрифта через пробел (если не пойдёт через пробел, попробовать через знак подчёркивания) добавить «cyr» (или попробовать в верхнем регистре или с большой буквы; хотя, в названиях шрифтов регистр, вроде бы, не важен).

16

Re: OFF: Кодировка текста

А в самой программе есть настройка шрифтов?

В самой программе нет, в реестре тоже.

17

Re: OFF: Кодировка текста

ypppu пишет:

Ранее была похожая проблема в программе Finale 2010...

Снова поднялся вопрос насчёт кодировки русского текста в программе "Make music Finale 2010". Если открыть файл, созданный более ранней версией программы Finale, русский текст виден как кракозябры.
В Windows XP это лечилось так:

CodePage_1251_full.reg пишет:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1250"="c_1251.nls"
"1252"="c_1251.nls"
"1253"="c_1251.nls"
"1254"="c_1251.nls"
"1255"="c_1251.nls"

В Windows 8 это уже не помогает. Какое ещё может быть решение проблемы?

18

Re: OFF: Кодировка текста

Писали, что там потребуется физическая подмена «c_1252.nls» переименованным в него «c_1251.nls».

19

Re: OFF: Кодировка текста

Эх, в Windows 8 нет доступа к файлу. Сколько ни ковыряю командную строку, нельзя переименовать или удалить.

20

Re: OFF: Кодировка текста

Попробуйте с помощью "TAKEOWN".

TAKEOWN /?

21

Re: OFF: Кодировка текста

Да и через свойства файла можно себя владельцем назначить.

22 (изменено: Malcev, 2014-01-11 22:53:45)

Re: OFF: Кодировка текста

Я делал подобное анлоккером, правда на вин 7.
http://www.emptyloop.com/unlocker/

23

Re: OFF: Кодировка текста

Malcev пишет:

Я делал подобное анлоккером, правда на вин 7.
http://www.emptyloop.com/unlocker/

Нет, это не совсем то, там папку или файл не удалить потому, что он открыт в каком-то процессе, а в ситуации ypppu проблема в принадлежности другому владельцу, который был создан в системе перед её продажей магазином. Действительно, можно исправить вручную через свойства папки или файла.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

24 (изменено: Yury, 2014-01-14 21:42:24)

Re: OFF: Кодировка текста

"Вот так их!":

@echo off
cd %windir%\System32
takeown /f c_1251.nls&& icacls c_1251.nls /grant:r %username%:f
takeown /f c_1252.nls&& icacls c_1252.nls /grant:r %username%:f
ren c_1252.nls c_1252.nls.bak&& ren c_1251.nls c_1252.nls
pause>nul

Очевидно, придётся запускать BAT-файл от имени администратора, поэтому строка "cd %windir%\System32" не будет иметь принципиального значения.

А владельцем системных файлов с правами полного доступа в Windows 7 и Windows 8 является "некто товарищ" TrustedInstaller, только этому пользователю "всё можно".

25

Re: OFF: Кодировка текста

Yury пишет:

А владельцем системных файлов с правами полного доступа в Windows 7 и Windows 8 является "некто товарищ" TrustedInstaller, только зтому пользователю "всё можно".

У меня Windows 7,  владелец с именем организации, которая продавала мне компьютер.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

26

Re: OFF: Кодировка текста

Скорее всего, это вторично. Сменить владельца всех папок и файлов Windows на текущего пользователя можно так:

takeown /f %windir% /r /d y

27

Re: OFF: Кодировка текста

Спасибо, попробую.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

28

Re: OFF: Кодировка текста

Большое спасибо всем, кто откликнулся. До этого читал про удаление файлов:
DEL - команда для удаления файлов
Как удалить файлы защищенные TrustedInstaller
Удаление системных файлов через Командную строку

Но работать пришлось через Telnet, с особенностями которого я, во-первых не знаком. Во-вторых, русские буквы выходили криво, после каждого шага приходилось копировать в текстовый редактор в кодировке MS-DOS чтобы прочесть. По команде takeown /f смена владельца получалась. А на cacls получаю ответ "Отказано в доступе." К тому же не очень было понятно, что писать %username%, в Telnet.
В ближайшее время попробую подъехать к человеку и проделать всё вручную от имени Администратора.

29

Re: OFF: Кодировка текста

Yury пишет:
@echo off
cd %windir%\System32
takeown /f c_1251.nls&& icacls c_1251.nls /grant:r %username%:f
takeown /f c_1252.nls&& icacls c_1252.nls /grant:r %username%:f
ren c_1252.nls c_1252.nls.bak&& ren c_1251.nls c_1252.nls
pause>nul

ypppu, teadrinker!
Проверил исполнение этого своего пакетного файла на своей системе (Windows 7), -- работает, как часы: никаких отказов в доступе. Запускал через контекстное меню файла "Запуск от имени администратора". Сделал и обратные операции, правда, вручную.

ypppu пишет:

А на cacls получаю ответ "Отказано в доступе."

Я против "cacls" ничего не имею, сам им пользовался для "вскрытия" папки "System Volume Information", когда там "засел" вирус, но это было на Windows XP, сейчас же пользуюсь "icacls", как у меня в коде.

ypppu пишет:

К тому же не очень было понятно, что писать %username%, в Telnet.

Тоже ничего не знаю про Telnet, но в большинстве случаев ничего не надо писать, так и оставить: "%username%". Права доступа изменятся у текущего пользователя, также как и при использовании "takeown" без "/a" владельцем назначается текущий польэователь.

P.S. Сейчас думаю о применении "robocopy" для этих целей. Если что-то получится, сообщу.

30

Re: OFF: Кодировка текста

Кажется, в Win8 есть специальный пользователь "Пользователь Telnet". А владелец нужного мне файла - TrustedInstaller.
В общем дошёл ногами, сделал Администратора владельцем файла вручную и заработало удаление с переименованием. Всё получилось. Правда, на одном сайте рекомендовали для корректной работы всем файлам вернуть обратно владельца TrustedInstaller. Как это сделать - не было времени разобраться, среди стандартных пользователей его нет. Оставил как есть, глюков не замечено.

Всем ещё раз спасибо, теперь русские буквы отображаются корректно!

31

Re: OFF: Кодировка текста

Что было: Хорошо известные идентификаторы безопасности в операционных системах Windows и что стало: Безопасность: Повышение безопасности в ОС Windows Vista с помощью новых списков управления доступом (ACL).

32

Re: OFF: Кодировка текста

Yury пишет:

P.S. Сейчас думаю о применении "robocopy" для этих целей. Если что-то получится, сообщу.


Что-то получилось:


::Делаем резервное копирование файлов со всеми атрибутами для возможности восстановления:

ROBOCOPY %windir%\System32 %TEMP%\.NLS_backup C_1251.NLS C_1252.NLS /COPYALL /XD *.*

::Копируем те же файлы без атрибутов безопасности и владения и переименовываем друг в друга (других вариантов, кроме переиенования друг в друга или создания "пустышки" для второго файла, не придумал):

ROBOCOPY %windir%\System32 %TEMP%\.NLS_renamed C_1251.NLS C_1252.NLS /XD *.*
REN %TEMP%\.NLS_renamed\C_1252.NLS ~C_1252.NLS
REN %TEMP%\.NLS_renamed\C_1251.NLS C_1252.NLS
REN %TEMP%\.NLS_renamed\~C_1252.NLS C_1251.NLS

::Делаем подмену файлов (воможна только в режиме архивирования -- с параметром "/B"), сохраняя все первоначальные атрибуты безопасности и владения (!):

ROBOCOPY %TEMP%\.NLS_renamed %windir%\System32 /B

PAUSE>nul

::Восстановление файлов в случае необходимости (воможно только в режиме архивирования -- с параметром "/B"):

ROBOCOPY %TEMP%\.NLS_backup %windir%\System32 /B  /COPYALL

PAUSE>nul


ypppu пишет:

Правда, на одном сайте рекомендовали для корректной работы всем файлам вернуть обратно владельца TrustedInstaller.


После выполнения данного варианта решения проблемы (если всё пойдёт по плану) это уже делать не нужно, т. к. все атрибуты безопасности и владения будут сохранены.



ypppu пишет:

Как это сделать - не было времени разобраться, среди стандартных пользователей его нет.


См. главу "Восстанавливаем права TrustedInstaller" в статье по Вашей же ссылке:

.