c – UNICODE,UTF-8和Windows混乱
我试图在
Windows中实现文本支持,之后还要转到
Linux平台.以统一的方式支持国际语言是理想的,但在考虑这两个平台时似乎并不容易实现.我花了大量的时间阅读UNICODE,UTF-8(和其他编码),多功能等等,这里是我迄今为止所了解的:
作为标准,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()函数). 解决方法
>正确.您将Windows NT调用的UTF-8转换为UTF-16.
>大多数时候你会使用UTF-8的常规字符串函数 – strlen,strcpy(ick),snprintf,strtol.他们可以正常工作UTF-8字符.使用char * for UTF-8或者你必须投掷所有东西. 请注意,像_mbstowcs这样的下划线版本不是标准的,通常它们没有下划线,如mbstowcs. >如果您正在解析字符串(例如,字符串为C或JavaScript代码,也许您需要语法高亮),则可以逐个字节地执行大部分工作,并忽略多字节方面. 见:C++ iterate or split UTF-8 string into array of symbols? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |