作为标准,UNICODE描述了可映射的字符集以及它们发生的顺序.我称之为“什么”:UNICODE指定可用的内容.
UTF-8(和其他编码)指定如何:如何以二进制格式表示每个字符.
现在,在Windows上,他们最初选择了一个UCS-2编码,但是没有满足要求,所以UTF-16是它们所拥有的,这在必要时也是多字符的.
所以这里是detmma:
> Windows内部仅执行UTF-16,因此,如果要支持国际字符,您将被迫转换为其扩展版本,以便相应地使用操作系统调用.似乎没有任何支持用多字节UTF-8字符串调用类似CreateFileA()的东西,并且它看起来很正确.它是否正确?
>在C中,有一些多字节支持函数(_mbscat,_mbscpy等),但是在windows上,这些函数的字符类型被定义为unsigned char *.鉴于_mbs系列函数不是一个完整的集合(例如,没有_mbstol将多字节字符串转换为long,例如),您被迫使用一些运行时函数的char *版本,这导致编译器问题,因为这些函数之间的签名/无符号类型的差异.有人甚至使用这些吗?你只是做一大堆铸造来解决错误?
>在C中,std :: string有迭代器,但这些都是基于char_type,而不是代码点.所以如果我在std :: string :: iterator上做一个,我得到下一个char_type,而不是下一个代码点.类似地,如果你调用std :: string :: operator [],你可以获得一个char_type的引用,它有很大的潜力,不是一个完整的代码点.那么如何通过代码点迭代一个std :: string呢? (C有_mbsinc()函数).
解决方法
>大多数时候你会使用UTF-8的常规字符串函数 – strlen,strcpy(ick),snprintf,strtol.他们可以正常工作UTF-8字符.使用char * for UTF-8或者你必须投掷所有东西.
请注意,像_mbstowcs这样的下划线版本不是标准的,通常它们没有下划线,如mbstowcs.
>很难想出实际上想要在Unicode字符串上使用operator []的示例,我的建议是远离它.同样,迭代一个字符串令人吃惊的是很少的用途:
>如果您正在解析字符串(例如,字符串为C或JavaScript代码,也许您需要语法高亮),则可以逐个字节地执行大部分工作,并忽略多字节方面.
>如果您正在进行搜索,那么您也将逐个字节(但请记住先规范化).
>如果你正在寻找单词或者拼写图形集合边界,你将需要使用像ICU这样的库.算法不简单.
>最后,您可以随时将一大段文本转换为UTF-32,并以此方式进行处理.我认为这是最合适的选择,如果你正在实现任何Unicode算法,如排序规则或打破.