在Lua/Corona中,UTF-8显示不正确。

在iPad Corona项目中,我使用network.request请求一个UTF-8的服务器文本文件(包含中文字符),但在控制台或应用中显示的结果却是“垃圾”。例如,谷歌浏览器可以正常显示相同的UTF-8页面,因为我在服务器(使用PHP)发送此页时设置了http头为“Content-Type: text/plain; charset=utf-8”(没有BOM,字节顺序标记)。在Lua中看到的“垃圾”看起来非常像当我使用选项菜单“强制”Chrome将页面呈现为ISO-8859-1时的样子。

有人可以提供帮助或指引吗? 如果所有其他方法都失败了,如何在Lua中将“垃圾”字符串转换回其UTF-8的原始形式?

感谢任何帮助!

原文链接 https://stackoverflow.com/questions/5154253

点赞
stackoverflow用户404568
stackoverflow用户404568

Lua 并不知道任何关于 UTF-8 的事情;Lua 字符串只是字节序列。听起来好像是 Corona 自己将字符串解析成了 ISO8859-1 格式。最有可能的原因是,他们做了一些非常愚蠢和天真的事情,比如将字符串的每个字节视为 Unicode 编码点。

很遗憾我不知道 Corona,所以无法提供任何具体的解决方案,但我建议查看一下它具有哪些涉及编码的函数——例如,可能会有一种特定的函数来呈现特定编码的字符串。

2011-03-01 13:39:57
stackoverflow用户510531
stackoverflow用户510531

你能展示一下你的 network.request() 调用的代码吗?

如果你正在下载一个 html 页面,你应该使用 network.download()

2011-04-11 23:31:56
stackoverflow用户360539
stackoverflow用户360539

我遇到了完全相同的问题,只是出现了日语字符。尽管 Lua 不支持 UTF-8,但 Corona 的行为却好像支持这种编码。这意味着......如果你传递一个 UTF-8 字符串到 display.newText(...) 函数,它应该能够正确地显示。如果你将其输出到控制台,它实际上会打印出字符串的原始字节。如果你尝试打印字符串的长度,它实际上会输出字节的数量。

因此,总结一下,Lua 将所有字符串视为字节数组。它对 UTF-8 一无所知。某些 Corona API 方法,当传递 UTF-8 字符串时,将正确地显示这些字符串。

当我混合使用 UTF-8 和普通 ASCII 字符时,我遇到了问题,我认为这就让 Corona 感到困惑了(我的意思是我混合使用了英文字母和日文字母......虽然它们都是 UTF-8 编码)。我有一个猜想,那就是字符串中的每个字符必须具有相同的字节长度,Corona 才能正确地显示它。尝试逐个字符打印来查看是否有帮助。如果你遇到了麻烦,请在这里随时发表评论。我也想自己解决这个问题。

2011-04-15 17:02:09