Dav*_*ave 17 c++ unicode utf-8 utf-16 wstring
我正在为Windows开发一个仅限英语的C++程序,我们被告知"总是使用std :: wstring",但似乎团队中的任何人都没有太多理解.
我已经阅读了标题为"std :: wstring VS std :: string.的问题.这非常有用,但我仍然不太明白如何将所有这些信息应用到我的问题中.
我正在处理的程序在Windows GUI中显示数据.该数据以XML格式保存.我们经常使用XSLT将XML转换为HTML或XSL:FO以用于报告目的.
根据我所读到的内容,我的感觉是HTML应编码为UTF-8.我对GUI开发知之甚少,但我读到的一点点表明GUI内容都是基于UTF-16编码的字符串.
我想知道这会让我离开的地方.假设我们认为所有持久化数据都应该是UTF-8编码的XML.这是否意味着为了在UI组件中显示持久化数据,我应该真正执行某种明确的UTF-8到UTF-16转码过程吗?
我怀疑我的解释可以使用澄清,所以如果你有任何问题,我会尝试提供.
从NT4开始的Windows基于Unicode编码的字符串,是的.早期版本基于UCS-2,它是前身或UTF-16,因此不支持UTF-16所有的所有字符.更高版本基于UTF-16.但并非所有操作系统都基于UTF-16/UCS-2.例如,*nix系统基于UTF-8.
UTF-8是持久存储数据的非常好的选择.它是所有Unicode环境中普遍支持的编码,它在数据大小和无损数据兼容性之间取得了良好的平衡.
是的,您必须解析XML,从中提取必要的信息,然后将其解码并转换为UI可以使用的内容.
std :: wstring从技术上讲是UCS-2:每个字符使用两个字节,并且代码表大多映射为Unicode格式。重要的是要了解UCS-2与UTF-16不同!UTF-16允许使用“代理对”来表示超出两个字节范围的字符,但是UCS-2为每个字符,句点使用恰好两个字节。
针对您的情况的最佳规则是在读写磁盘时进行转码。一旦存入内存,请以UCS-2格式保存。Windows API会将其读取为好像是UTF-16(也就是说,如果std :: wstring不了解代理对的概念,如果您手动创建它们(如果您唯一的语言是,则不会)英文),Windows会阅读它们)。
在现代,无论何时读取或不读取序列化格式(例如XML)的数据,您都可能需要进行转码。这是生活中令人不愉快且非常不幸的事实,但这是不可避免的,因为Unicode是宽度可变的字符编码,并且C ++中大多数基于字符的操作都是作为数组完成的,因此您需要保持一致的间距。
诸如.NET之类的高级框架掩盖了大多数细节,但在幕后,它们以相同的方式处理转码:将可变宽度数据更改为固定宽度字符串,对其进行处理,然后对其进行更改在需要输出时返回到可变宽度编码。
AFAIK在Windows上使用std :: wstring在C++中工作并使用UTF-8存储在文件中(这听起来很合理),然后你必须在写入文件时将数据转换为UTF-8,然后转换回从文件读取时的UTF-16.看看这个链接:用C++编写UTF-8文件.
我会坚持使用Visual Studio默认的项目 - >属性 - >配置属性 - >常规 - >字符集 - >使用Unicode字符集,使用wchar_t类型(即使用std :: wstring)而不使用TCHAR类型.(例如,我只使用wlenlen版本的strlen而不是 _tcslen.)
| 归档时间: |
|
| 查看次数: |
16972 次 |
| 最近记录: |