Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 18.08.2016
Сообщений: 6
1

Кириллица в Lua

21.08.2016, 12:49. Показов 4939. Ответов 3
Метки нет (Все метки)

Здравствуйте, друзья!
Я уже задавал этот вопрос в ветке Lua, но там мне не помогли (Кириллица из Lua в C#).Надеюсь, удастся найти решение здесь.
Я подключаю lua скрипты к C# коду с помощью библиотеки NLua (http://nlua.org). Проблема заключается в некорректном чтении строковых переменных, содержащих кириллицу. Все остальное работает нормально. Самый простой пример кода, воспроизводящего ошибку, выглядит так:
C#
1
2
3
Lua lua = new Lua();
lua.DoFile("script.lua");
Console.WriteLine(lua["var"]);
При этом файл скрипта script.lua содержит одну строчку:
Код
var = 'кириллица'
Вывод на консоль - либо знаки вопроса, либо неверные символы в зависимости от кодировки файла скрипта. Все, что мне дало упорное гугление - советы установить нужную кодировку файла. Однако, это не помогло. Сперва я использовал текстовый редактор и метод тыка. Потом сделал перебор всех возможных кодировок:
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.HeaderName);
            }
Здесь файл скрипта создается программно в цикле по доступным кодировкам. Потом из него читается переменная.
Вот так выглядит вывод командной строки:
Кликните здесь для просмотра всего текста
[error in lua] (IBM037)
[cyrillic ?????????] (IBM437)
[error in lua] (IBM500)
[cyrillic ?????????] (asmo-708)
[cyrillic ?????????] (ibm850)
[cyrillic ?????????] (ibm852)
[cyrillic Æ·á·Ðз¤*] (ibm855)
[cyrillic ?????????] (ibm857)
[cyrillic ?????????] (IBM00858)
[cyrillic ?????????] (ibm860)
[cyrillic ?????????] (ibm861)
[cyrillic ?????????] (ibm861)
[cyrillic ?????????] (IBM863)
[cyrillic ?????????] (ibm864)
[cyrillic ?????????] (IBM865)
[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 ?????????] (windows-1250)
[cyrillic êèðèëëèöà] (windows-1251)
[cyrillic ?????????] (Windows-1252)
[cyrillic ?????????] (windows-1253)
[cyrillic ?????????] (windows-1254)
[cyrillic ?????????] (windows-1255)
[cyrillic ?????????] (windows-1256)
[cyrillic ?????????] (windows-1257)
[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 ?????????] (windows-38598)
[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)

Здесь в квадратных скобках полученный текст, в круглых название кодировки lua-файла. Видно, что подходящего варианта не нашлось.
Проблема одинаково воспроизводится и на машинах с windows, и на машинах с linux.
Я зашел в тупик и не знаю как быть. Надеюсь на вашу помощь.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.08.2016, 12:49
Ответы с готовыми решениями:

Кириллица из Lua в C#
Добрый день, друзья! Начинаю знакомство с Lua. Столкнулся с проблемой некорректного чтения...

Подсчитать количество вхождений буквы (кириллица) в строку (кириллица)
Суть такая: по требованию программы ввести строку символов (обыкновенный текст, кириллица(!!!)) и...

Lua наследование, lua ооп
Подскажите пожалуйста, как наследовать класс? Не получается выдаёт ошибку local car = {} --...

LUA + QT
Такая задача: Есть Lua-файл приблизительно такого содержания: Необходимо в реальном времени...

3
1304 / 977 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
21.08.2016, 20:24 2
Лучший ответ Сообщение было отмечено NickoTin как решение

Решение

C#
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
// никогда не видел эту либу,
// да и ошибка какая-то не очень...
// но не бросать же человека в беде ?! ))
// вот, вроде, вполне готовое решение
 
using System;
using System.IO;
using System.Text;
using NLua;
 
namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            Lua lua = new Lua();
 
            //lua.DoString("var = 'кириллица'"); // оно даже так не работает
            //lua.DoString(Encoding.UTF8.GetBytes("var = 'кириллица'")); // а вот так - пожалуйста
 
            // таким образом,
 
            lua.DoString(Encoding.UTF8.GetBytes(File.ReadAllText("script.lua", Encoding.Default))); // где Encoding.Default === cp1251 у нас
 
            Console.WriteLine(lua["var"]);
        }
    }
}
 
// будет желание "копнуть", см. сигнатуру LuaNetLoadBuffer. конкретнее, указанный там CharSet
0
0 / 0 / 0
Регистрация: 18.08.2016
Сообщений: 6
21.08.2016, 20:43  [ТС] 3
Цитата Сообщение от Mikant Посмотреть сообщение
//lua.DoString("var = 'кириллица'"); // оно даже так не работает
а у меня работает. но не попишешь же скрипт в строках.
Цитата Сообщение от Mikant Посмотреть сообщение
lua.DoString(Encoding.UTF8.GetBytes(File.ReadAllText("script .lua", Encoding.Default))); // где Encoding.Default === cp1251 у нас
А вот это хорошо. я не догадался весь скрипт считать, как текст. Спасибо!
Вот, что я пока наковырял: пытался прочтенную переменную перевести в другую кодировку и сравнивать с желаемым значением.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
foreach (EncodingInfo ei1 in Encoding.GetEncodings()) {
                Encoding e1 = ei1.GetEncoding ();
                string s1 = "кириллица";
                System.IO.File.Delete ("script.lua");
                System.IO.File.AppendAllText ("script.lua", "var = '" + s1 + "'", e1);
                string s2;
                try {
                    Lua lua = new Lua ();
                    lua.DoFile ("script.lua");
                    s2 = lua ["var"] as string;
                    foreach (EncodingInfo ei2 in Encoding.GetEncodings()) {
                        Encoding e2 = ei2.GetEncoding ();
                        byte[] bytes = e2.GetBytes (s2);
                        foreach (EncodingInfo ei3 in Encoding.GetEncodings()) {
                            try {
                                Encoding e3 = ei3.GetEncoding ();
                                string s3 = e3.GetString (bytes);
                                if (s1 == s3)
                                    Console.WriteLine ("({0})=>({1})=>({2}):[{3}]",e1.HeaderName, e2.HeaderName, e3.HeaderName, s3);
                            } catch { }
                        }
                    }
                } catch { }
            }
т.е. прогонка по всем кодировкам файла, и всем вариантам перевода прочитанных крокозябр. вот что получилось:
Кликните здесь для просмотра всего текста
(ibm855)=>(Windows-1252)=>(ibm855):[кириллица]
(ibm855)=>(iso-8859-1)=>(ibm855):[кириллица]
(ibm866)=>(Windows-1252)=>(ibm866):[кириллица]
(ibm866)=>(windows-1254)=>(ibm866):[кириллица]
(ibm866)=>(windows-1258)=>(ibm866):[кириллица]
(ibm866)=>(iso-8859-1)=>(ibm866):[кириллица]
(ibm866)=>(iso-8859-9)=>(ibm866):[кириллица]
(iso-2022-jp)=>(asmo-708)=>(iso-2022-jp):[кириллица]
(iso-2022-jp)=>(iso-8859-1)=>(iso-2022-jp):[кириллица]
(iso-2022-jp)=>(iso-8859-2)=>(iso-2022-jp):[кириллица]
(iso-2022-jp)=>(iso-8859-3)=>(iso-2022-jp):[кириллица]
(iso-2022-jp)=>(iso-8859-4)=>(iso-2022-jp):[кириллица]
(iso-2022-jp)=>(iso-8859-5)=>(iso-2022-jp):[кириллица]
(iso-2022-jp)=>(iso-8859-6)=>(iso-2022-jp):[кириллица]
(iso-2022-jp)=>(iso-8859-7)=>(iso-2022-jp):[кириллица]
(iso-2022-jp)=>(iso-8859-8)=>(iso-2022-jp):[кириллица]
(iso-2022-jp)=>(iso-8859-9)=>(iso-2022-jp):[кириллица]
(iso-2022-jp)=>(iso-8859-15)=>(iso-2022-jp):[кириллица]
(iso-2022-jp)=>(windows-38598)=>(iso-2022-jp):[кириллица]
(gb2312)=>(Windows-1252)=>(gb2312):[кириллица]
(gb2312)=>(Windows-1252)=>(euc-jp):[кириллица]
(gb2312)=>(Windows-1252)=>(GB18030):[кириллица]
(gb2312)=>(iso-8859-1)=>(gb2312):[кириллица]
(gb2312)=>(iso-8859-1)=>(euc-jp):[кириллица]
(gb2312)=>(iso-8859-1)=>(GB18030):[кириллица]
(gb2312)=>(iso-8859-15)=>(gb2312):[кириллица]
(gb2312)=>(iso-8859-15)=>(euc-jp):[кириллица]
(gb2312)=>(iso-8859-15)=>(GB18030):[кириллица]
(ks_c_5601-1987)=>(Windows-1252)=>(ks_c_5601-1987):[кириллица]
(ks_c_5601-1987)=>(Windows-1252)=>(euc-kr):[кириллица]
(ks_c_5601-1987)=>(iso-8859-1)=>(ks_c_5601-1987):[кириллица]
(ks_c_5601-1987)=>(iso-8859-1)=>(euc-kr):[кириллица]
(ks_c_5601-1987)=>(iso-8859-15)=>(ks_c_5601-1987):[кириллица]
(ks_c_5601-1987)=>(iso-8859-15)=>(euc-kr):[кириллица]
(windows-1251)=>(Windows-1252)=>(windows-1251):[кириллица]
(windows-1251)=>(iso-8859-1)=>(windows-1251):[кириллица]
(windows-1251)=>(iso-8859-15)=>(windows-1251):[кириллица]
(koi8-r)=>(Windows-1252)=>(koi8-r):[кириллица]
(koi8-r)=>(Windows-1252)=>(koi8-u):[кириллица]
(koi8-r)=>(windows-1254)=>(koi8-r):[кириллица]
(koi8-r)=>(windows-1254)=>(koi8-u):[кириллица]
(koi8-r)=>(iso-8859-1)=>(koi8-r):[кириллица]
(koi8-r)=>(iso-8859-1)=>(koi8-u):[кириллица]
(koi8-r)=>(iso-8859-9)=>(koi8-r):[кириллица]
(koi8-r)=>(iso-8859-9)=>(koi8-u):[кириллица]
(koi8-r)=>(iso-8859-15)=>(koi8-r):[кириллица]
(koi8-r)=>(iso-8859-15)=>(koi8-u):[кириллица]
(koi8-u)=>(Windows-1252)=>(koi8-r):[кириллица]
(koi8-u)=>(Windows-1252)=>(koi8-u):[кириллица]
(koi8-u)=>(windows-1254)=>(koi8-r):[кириллица]
(koi8-u)=>(windows-1254)=>(koi8-u):[кириллица]
(koi8-u)=>(iso-8859-1)=>(koi8-r):[кириллица]
(koi8-u)=>(iso-8859-1)=>(koi8-u):[кириллица]
(koi8-u)=>(iso-8859-9)=>(koi8-r):[кириллица]
(koi8-u)=>(iso-8859-9)=>(koi8-u):[кириллица]
(koi8-u)=>(iso-8859-15)=>(koi8-r):[кириллица]
(koi8-u)=>(iso-8859-15)=>(koi8-u):[кириллица]
(iso-8859-5)=>(Windows-1252)=>(iso-8859-5):[кириллица]
(iso-8859-5)=>(iso-8859-1)=>(iso-8859-5):[кириллица]
(iso-8859-5)=>(iso-8859-15)=>(iso-8859-5):[кириллица]
(euc-jp)=>(Windows-1252)=>(gb2312):[кириллица]
(euc-jp)=>(Windows-1252)=>(euc-jp):[кириллица]
(euc-jp)=>(Windows-1252)=>(GB18030):[кириллица]
(euc-jp)=>(iso-8859-1)=>(gb2312):[кириллица]
(euc-jp)=>(iso-8859-1)=>(euc-jp):[кириллица]
(euc-jp)=>(iso-8859-1)=>(GB18030):[кириллица]
(euc-jp)=>(iso-8859-15)=>(gb2312):[кириллица]
(euc-jp)=>(iso-8859-15)=>(euc-jp):[кириллица]
(euc-jp)=>(iso-8859-15)=>(GB18030):[кириллица]
(euc-kr)=>(Windows-1252)=>(ks_c_5601-1987):[кириллица]
(euc-kr)=>(Windows-1252)=>(euc-kr):[кириллица]
(euc-kr)=>(iso-8859-1)=>(ks_c_5601-1987):[кириллица]
(euc-kr)=>(iso-8859-1)=>(euc-kr):[кириллица]
(euc-kr)=>(iso-8859-15)=>(ks_c_5601-1987):[кириллица]
(euc-kr)=>(iso-8859-15)=>(euc-kr):[кириллица]
(GB18030)=>(Windows-1252)=>(gb2312):[кириллица]
(GB18030)=>(Windows-1252)=>(euc-jp):[кириллица]
(GB18030)=>(Windows-1252)=>(GB18030):[кириллица]
(GB18030)=>(iso-8859-1)=>(gb2312):[кириллица]
(GB18030)=>(iso-8859-1)=>(euc-jp):[кириллица]
(GB18030)=>(iso-8859-1)=>(GB18030):[кириллица]
(GB18030)=>(iso-8859-15)=>(gb2312):[кириллица]
(GB18030)=>(iso-8859-15)=>(euc-jp):[кириллица]
(GB18030)=>(iso-8859-15)=>(GB18030):[кириллица]

Это варианты, в которых на выходе получался нужный текст. первая кодировка - файл скрипта, вторая и третья - перевод текста "из" и "в".
0
1304 / 977 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
22.08.2016, 00:04 4
Цитата Сообщение от dmitry1204 Посмотреть сообщение
А вот это хорошо. я не догадался весь скрипт считать, как текст. Спасибо!
пожалуйста. но, как видно, проблема не в Вашем коде, а в этом nlua
зы. а вот эта "прогонка" по тому списку мало того, что была в первом посте, так ещё и мало значения имеет без осознания понятия кодировки текста
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2016, 00:04

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

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


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

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

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