没有真正的“unicode 字符串”这样的东西。字符串是可以包含任何内容的字节序列。但是,知道字符串中数据的编码很重要。
我使用 Lua 和UTF-8 字符串,它只适用于我关心的所有操作。我不使用任何 Unicode 字符串库,尽管它们可用于 Lua(ICU4Lua、slnunicode等)。
关于在 Lua 中使用 UTF-8 字符串的一些注意事项:
- 字符串长度(# 运算符)返回以字节为单位的字符串长度,而不是字符或代码点(非 ASCII 字符可能是多个字节的序列)。
- 字符串拆分(例如 string.sub)不得拆分 UTF-8 序列。
- 字符串匹配(string.find、string.match)适用于 ASCII 模式。
- 子字符串搜索(例如 'plain' 模式下的 string.find)使用 UTF-8 作为针或干草堆。
以 UTF-8 计算代码点非常简单,但效率略低于其他编码。例如在 Lua 中:
function utf8_length(str)
return select(2, string.gsub(str, "[^\128-\193]", ""));
end
如果您需要的不仅仅是这种东西,我提到的 unicode 库为您提供了所有 API,包括编码之间的转换。
就我个人而言,我更喜欢这种直接的方法,而不是任何强制你使用某种 unicode 风格的语言(例如 Javascript),或者尝试通过在语言中内置多种编码来变得聪明(例如 Python)。根据我的经验,它们只会导致头痛和性能瓶颈。
无论如何,我认为每个开发人员都应该对 unicode 的工作原理以及不同编码之间的原理差异有一个很好的基本了解,以便他们可以就如何在他们的应用程序中处理 unicode 做出最佳选择。
例如,如果您的应用程序中所有现有的字符串都采用宽字符编码,那么使用 Lua 就不太方便,因为您必须为进出 Lua 的每个字符串添加转换。这是完全可能的,但如果您的应用程序可能受 CPU 限制(如在游戏中),那么这将是一个负面的性能方面。