【发布时间】:2016-12-28 00:46:33
【问题描述】:
我尝试使用 NLua 库 (nlua.org) 在 C# 项目中添加 lua 脚本。 我的问题是字符串值中西里尔符号的不正确表示。 我的 C# 代码是:
Lua lua = new Lua();
lua.DoFile("script.lua");
Console.WriteLine(lua["var"]);
脚本文件代码为:
var = 'кириллица'
更改脚本文件编码对我没有帮助。我还尝试使用此代码搜索正确的脚本文件编码:
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)
您可以看到根本没有正确的变体。所以我不知道如何解决这个问题。
【问题讨论】:
-
Console.WriteLine可能期望 866 代码页,但您的字符串可能是 win1251。你能在Console.WriteLine之前调用 WinAPICharToOem()吗? -
如果这没有帮助,请提供以下信息:1)将以下代码
var = 'кириллица';print(var:byte(1,-1))写入您的script.lua并显示输出; 2)不要更改脚本文件的编码,尝试更改s2变量的编码(我不知道如何在C#中这样做)。 -
@EgorSkriptunoff 感谢您的回复。我不知道如何在 c# 中使用 CharToOem。
var = 'кириллица';print(var:byte(1,-1))的控制台输出为208 186 208 184 209 128 208 184 208 187 208 187 208 184 209 134 208 176 -
好的,你的 Lua 文件是 UTF-8 编码的。现在,为确保 C# 正确接收此字符串,请尝试将变量
s2输出到 GUI 窗口而不是控制台,例如,System.Windows.MessageBox.Show(s2); -
没有必要。我可以使用调试器看到不正确的符号。