编码方式
Unipre定义了一个 字符 列表(字母,数字,字母符号,控制代码等),但它们的表示形式(以字节为单位)定义为 encoding
。如今,最常见的Unipre编码是UTF-8,UTF-16和UTF-32。UTF-16通常与Unipre关联,因为它是在Windows,Java,NET环境,C和C
++语言(在Windows上)中为Unipre支持而选择的。请注意,这不是唯一的一种,并且在您的生活中,您肯定还会遇到UTF-8文本(尤其是来自Web和Linux文件系统的文本)和UTF-32(Windows世界之外)。必读的入门文章:绝对最低限度每个软件开发人员绝对,肯定必须了解Unipre和字符集(无借口!)和UTF-8无处不在-
宣言。IMO特别是第二个链接(无论您的意见是UTF-8还是UTF-16)都非常有启发性。
让我引用维基百科:
由于最常用的字符全部在“基本多语言平面”中,因此对代理对的处理通常没有经过全面测试。即使在流行且经过充分审查的应用程序软件(例如CVE-2008-2938,CVE-2012-2135)中,这也会导致持续的错误和潜在的安全漏洞。
要了解问题的出处,仅需一些简单的数学运算即可:Unipre定义了大约11万个代码点(请注意,并非所有代码点都是grapheme)。Windows环境下的C,C
++,C#,VB.NET,Java和许多其他语言中的“
Unipre字符类型”(旧ASP经典页面上的VBscript明显例外)使用UTF-16编码,然后是两个字节(此处的类型名称为直观但完全具有误导性,因为它是一个
代码单位 ,而不是字符或代码点)。
请检查此区别,因为它是基础的:代码单元在逻辑上与字符不同,即使有时它们重合,它们也不是同一回事。这如何影响您的编程生活?假设您有此C#代码,并且您的规范(由考虑字符的
真实 定义的人编写)说“密码长度必须为4个 字符 ”:
bool IsValidPassword(string text ) { return text.Length >= 4;}该代码是 丑陋的,错误的和残破的 。
Length财产申报数量 代码单位
在
text字符串变量,现在你知道他们是不同的。您的代码将被验证
n̊o̅为有效密码(但它由两个字符,四个代码点组成-
几乎总是与代码单元一致)。现在,试想一下将其应用于您的应用程序的所有层:一个经过UTF-8编码的数据库字段,该字段已通过先前的代码(输入为UTF-16)进行了有效验证,错误将累加,您的波兰朋友
ŚwiętosławKoźmicki
对此不会高兴。现在认为您必须使用相同的技术来验证用户的名字,并且您的用户是中国人(但不用担心,如果您不在乎,那么他们将在很短的时间内成为您的用户)。另一个例子:这种简单的C#算法计算字符串中的不同字符将由于相同的原因而失败:
myString.Distinct().Count()
如果用户输入此汉字字符,


![如何通过字符比较来执行Unicode感知字符?[关闭] 如何通过字符比较来执行Unicode感知字符?[关闭]](http://www.mshxw.com/aiimages/31/383724.png)
