Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lua
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
dmitry1204
0 / 0 / 0
Регистрация: 18.08.2016
Сообщений: 6
1

Кириллица из Lua в C#

18.08.2016, 16:58. Просмотров 1744. Ответов 6
Метки нет (Все метки)

Добрый день, друзья!
Начинаю знакомство с Lua. Столкнулся с проблемой некорректного чтения кириллицы в скриптах.
Сам скрипт используется программой на C# с помощью библиотеки NLua (http://nlua.org). Все работает корректно, кроме строковых переменных с кириллицей. Например этот код:
C#
1
2
3
Lua lua = new Lua();
lua.DoFile("script.lua");
Console.WriteLine(lua["var"]);
при таком теле скрипта:

Код
var = 'кириллица'
выводит в консоль текст в неправильном виде.
Я пытался сохранять файл script.lua в разных кодировках. Это не привело к успеху. Тогда я сделал полный перебор по всем возможным кодировкам (создавал в цикле файл с очередной кодировкой и сразу его читал). Неправильный вывод русского текста выглядит при этом по разному, но правильного варианта не нашлось.
Подскажите, как быть.
п.с. проблема проявляет себя одинаково что в VS под Windows, что в Xamarin под Linux.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2016, 16:58
Ответы с готовыми решениями:

LUA + C++
Привет всем :) я чото не понимаю чо у меня выевляется ошибки luaavg.obj...

Скрипты lua
Вопрос: вот я у себя на хабе (дсс) настроил викторину, а как мне сделать чтобы...

Ошибка lua
Всем привет Попался мне один файлик resource.car после его распаковки...

vs c++ & lua
Здравствуйте, занимаюсь разработкой 3д игры, пишу движок и прочее, когда то...

Учебник по Lua
Добрый день! Подскажите пожалуйста хороший учебник по Lua на русском или...

6
ProgJ
87 / 85 / 10
Регистрация: 20.11.2008
Сообщений: 724
18.08.2016, 19:06 2
1. Количество символов сравнивали?
2. Попробуйте сохранить вывод в файл и открыть в программе определяющей кодировку автоматически
0
dmitry1204
0 / 0 / 0
Регистрация: 18.08.2016
Сообщений: 6
18.08.2016, 22:09  [ТС] 3
Количество символов может совпадать или нет в зависимости от кодировки файла. Вот пример кода, в котором производится перебор кодировок файла со скриптом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
foreach (EncodingInfo ei in Encoding.GetEncodings()) {
                Encoding e = ei.GetEncoding ();
                string s1 = "cyrillic кириллица";
                System.IO.File.Delete ("script.lua");
                System.IO.File.AppendAllText ("script.lua", "var = '" + s1 + "'", e);
                string s2;
                try {
                    Lua lua = new Lua ();
                    lua.DoFile ("script.lua");
                    s2 = lua ["var"] as string;
                } catch {
                    s2 = "error in lua";
                }
                Console.WriteLine ("[{0}]\t({1})", s2, e.BodyName);
            }
Здесь выводится полученный текст в квадратных скобках, а в круглых название кодировки. Вывод консоли выглядит так:
Кликните здесь для просмотра всего текста

[error in lua] (IBM037)
[cyrillic ?????????] (IBM437)
[error in lua] (IBM500)
[cyrillic ?????????] (iso-8859-6)
[cyrillic ?????????] (ibm850)
[cyrillic ?????????] (ibm852)
[cyrillic Æ·á·Ðз¤*] (ibm855)
[cyrillic ?????????] (ibm857)
[cyrillic ?????????] (IBM00858)
[cyrillic ?????????] (ibm860)
[cyrillic ?????????] (ibm861)
[cyrillic ?????????] (ibm862)
[cyrillic ?????????] (IBM863)
[cyrillic ?????????] (ibm864)
[cyrillic ?????????] (IBM863)
[cyrillic ª¨à¨««¨æ*] (ibm866)
[cyrillic ?????????] (ibm869)
[error in lua] (ibm870)
[cyrillic ?????????] (windows-874)
[error in lua] (ibm875)
[cyrillic
{
y

y
|
|
y

p] (iso-2022-jp)
[cyrillic §Ü§Ú§â§Ú§Ý§Ý§Ú§è§Ñ] (gb2312)
[cyrillic ¬Ü¬Ú¬â¬Ú¬Ý¬Ý¬Ú¬è¬Ñ] (ks_c_5601-1987)
[cyrillic ?????????] (big5)
[error in lua] (ibm1026)
[error in lua] (ibm1047)
[error in lua] (IBM01140)
[error in lua] (IBM01141)
[error in lua] (IBM01142)
[error in lua] (IBM01143)
[error in lua] (ibm1144)
[error in lua] (ibm1145)
[error in lua] (ibm1146)
[error in lua] (ibm1147)
[error in lua] (ibm1148)
[error in lua] (ibm1149)
[error in lua] (utf-16)
[error in lua] (utf-16BE)
[cyrillic ?????????] (iso-8859-2)
[cyrillic êèðèëëèöà] (koi8-r)
[cyrillic ?????????] (iso-8859-1)
[cyrillic ?????????] (iso-8859-7)
[cyrillic ?????????] (iso-8859-9)
[cyrillic ?????????] (windows-1255)
[cyrillic ?????????] (windows-1256)
[cyrillic ?????????] (iso-8859-4)
[cyrillic ?????????] (windows-1258)
[cyrillic ?????????] (macintosh)
[cyrillic ?????????] (x-mac-icelandic)
[error in lua] (utf-32)
[error in lua] (utf-32BE)
[cyrillic ?????????] (us-ascii)
[error in lua] (IBM273)
[error in lua] (IBM277)
[error in lua] (IBM278)
[error in lua] (IBM280)
[error in lua] (IBM284)
[error in lua] (IBM285)
[error in lua] (IBM290)
[error in lua] (IBM297)
[error in lua] (IBM420)
[error in lua] (IBM424)
[cyrillic ËÉÒÉÌÌÉÃÁ] (koi8-r)
[error in lua] (IBM871)
[error in lua] (IBM1025)
[cyrillic ËÉÒÉÌÌÉÃÁ] (koi8-u)
[cyrillic ?????????] (iso-8859-1)
[cyrillic ?????????] (iso-8859-2)
[cyrillic ?????????] (iso-8859-3)
[cyrillic ?????????] (iso-8859-4)
[cyrillic ÚØàØÛÛØæÐ] (iso-8859-5)
[cyrillic ?????????] (iso-8859-6)
[cyrillic ?????????] (iso-8859-7)
[cyrillic ?????????] (iso-8859-8)
[cyrillic ?????????] (iso-8859-9)
[cyrillic ?????????] (iso-8859-15)
[cyrillic ?????????] (iso-8859-8)
[cyrillic ?????????] (iso-2022-jp)
[cyrillic ?????????] (iso-2022-jp)
[cyrillic ?????????] (iso-2022-jp)
[cyrillic §Ü§Ú§â§Ú§Ý§Ý§Ú§è§Ñ] (euc-jp)
[cyrillic ¬Ü¬Ú¬â¬Ú¬Ý¬Ý¬Ú¬è¬Ñ] (euc-kr)
[cyrillic §Ü§Ú§â§Ú§Ý§Ý§Ú§è§Ñ] (GB18030)
[cyrillic ?????????] (x-iscii-de)
[cyrillic ?????????] (x-iscii-be)
[cyrillic ?????????] (x-iscii-ta)
[cyrillic ?????????] (x-iscii-te)
[cyrillic ?????????] (x-iscii-as)
[cyrillic ?????????] (x-iscii-or)
[cyrillic ?????????] (x-iscii-ka)
[cyrillic ?????????] (x-iscii-ma)
[cyrillic ?????????] (x-iscii-gu)
[cyrillic ?????????] (x-iscii-pa)
[error in lua] (utf-7)
[error in lua] (utf-8)

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

Добавлено через 2 часа 14 минут
Да, кстати. проблема именно где-то в чтении файла. Такой код работает нормально:
C#
1
2
lua.DoString("var = 'кириллица'");
Console.WriteLine(lua["var"]);
0
ProgJ
87 / 85 / 10
Регистрация: 20.11.2008
Сообщений: 724
19.08.2016, 11:59 4
Цитата Сообщение от dmitry1204 Посмотреть сообщение
[cyrillic ª¨à¨««¨æ*] (ibm866)
По этой строчке видно, что у вас консоль в выводит в CP1251, а слово в CP866
Файл должен быть в кодировке консоли, т.е. в CP1251
0
dmitry1204
0 / 0 / 0
Регистрация: 18.08.2016
Сообщений: 6
19.08.2016, 14:48  [ТС] 5
Цитата Сообщение от ProgJ Посмотреть сообщение
По этой строчке видно, что у вас консоль в выводит в CP1251, а слово в CP866
Файл должен быть в кодировке консоли, т.е. в CP1251
А как вы сделали такой вывод?
Я пытался сохранять файл в этой кодировке. Результат тот же. Кроме того, если посмотреть внимательно в вывод консоли, видно, что 1251 там тоже есть. Почему-то только он называется koi8-r. Хотя сам настоящий koi8-r встречается там еще раз. Вот это win-1251:
Цитата Сообщение от dmitry1204 Посмотреть сообщение
[cyrillic êèðèëëèöà] (koi8-r)
А это настоящий koi8-r несколькими строчками ниже
Цитата Сообщение от dmitry1204 Посмотреть сообщение
[cyrillic ËÉÒÉÌÌÉÃÁ] (koi8-r)
Кстати, убедиться в этом можно, выполнив
C#
1
2
3
4
Encoding e1 = Encoding.GetEncoding(1251);
Console.WriteLine(e1.BodeName);
Encoding e2 = Encoding.GetEncoding("koi8-r");
Console.WriteLine(e2.BodeName);
При этом, хотя кодировки и имеют один и тот же bodyname, работают они по-разному и вроде бы правильно.
Так или иначе win-1251 не подходит. Я пробовал создавать такой файл и в текстовом редакторе и программно. Результат одинаковый.

Добавлено через 1 час 37 минут
Я разобрался с подозрительным совпадением. Это я накосячил выводя bodyname вместо headername
0
ProgJ
87 / 85 / 10
Регистрация: 20.11.2008
Сообщений: 724
24.08.2016, 14:42 6
Цитата Сообщение от dmitry1204 Посмотреть сообщение
А как вы сделали такой вывод?
Я создал файл в Far Manager в CP866 скопировал это ª¨à¨««¨æ* и сменил кодировку на CP1251
получилось кириллиц*
Но я не обратил внимания, что когда копировал, вставилось немного не то -- сработал корректор буфера обмена

ª¨à¨««¨æ* это мультибайт CP1201, т.е. консоль в Unicode
Слово кириллица в CP866 было прочитано как CP1251 (ЄЁаЁ««Ёж*) и "преобразовано" в CP1201
"Преобразование" заключается в добавление нулей перед каждым байтом

Похоже, что NLua хранит строки в своём собственном формате и иногда выполняет некорректное преобразование строк
0
dmitry1204
0 / 0 / 0
Регистрация: 18.08.2016
Сообщений: 6
24.08.2016, 22:23  [ТС] 7
да, похоже именно внутри nlua. решение нашлось в виде:
C#
1
lua.DoString (System.IO.File.ReadAllText ("script.lua", enc));
где enc - кодировка файла со скриптом
0
24.08.2016, 22:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2016, 22:23

Lua шифрование
Здравствуйте, есть такая задачка, кто-то сможет помочь? В файле содержатся...

Изучение Lua
Добрый день. Хочу начать изучать язык Lua но не знаю с чего начать. Может кто...

Установка Lua
Здравствуйте! Подскажите, пожалуйста как это сделать: Что бы вы могли...


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

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

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