在非西方语言中使用UTF-8而不是wchar_t有什么不便之处?

What are inconveniences of using UTF-8 instead of wchar_t with non-Western languages?

本文关键字:什么 wchar 西方语言 UTF-8      更新时间:2023-10-16

除了存储大小不同之外,使用wchar_t(2字节或4字节)和使用UTF-8编码进行面向非西方语言的文本处理编程有什么不同?

当使用wchar_t时,可以在C或c++库中以与非宽版本相同的方式和容易地使用宽版本的字符串函数。与使用标准字符串函数的广泛版本相比,UTF-8是否存在一些问题,它为非西方文本的字符串添加了一些额外的处理?

假设库函数适用于UTF-8(这通常不适用于Windows),那么只要您实际使用库函数,就没有真正的问题。但是,如果您编写代码手动解释字符串数组中的单个元素,则需要编写考虑到代码点在UTF-8中大于单个字节的代码-特别是在处理非英语字符(包括例如德语/斯堪的纳维亚字符,如'ä', 'ö', 'ü')时。即使每个条目使用16位,您也可以发现一个代码点占用2个16位条目的情况。

如果你不考虑到这一点,单独的部分可能会"混淆"处理,例如,将代码点中间的东西识别为具有不同含义的东西而不是某个东西的中间。

代码点的可变长度会导致各种有趣的影响,例如字符串长度和子字符串——其中in的长度是保存字符串的数组元素的数量,这可能与代码点的数量大不相同。

无论使用哪种编码,对于例如阿拉伯语的编码都有进一步的复杂性,其中需要将单个字符链接在一起。这当然只有在实际绘制角色时才重要,但至少值得记住。

术语(我的作品!):

字符 =可以显示在屏幕上的字母/符号。

码点 =字符串中字符的表示,可以是字符串数组中的一个或多个元素。

字符串数组 =字符串的存储空间,由固定大小的元素组成(如8位、16位、32位、64位)

String Element =字符串数组的一个单位