我正在创建一个C ++库,用于与不同语言编写的不同应用程序,如Java,C#,Delphi等。
偶尔我会遇到wstrings,strings,char *,wchar_t *之间的转换。例如。我坚持使用wchar_t,但必须使用正则表达式库来接受其他类似的问题。
我希望坚持使用w或普通字符串。我的库将主要处理ASCII字符,但也可以使用非ASCII字符,如名称等。因此,我可以永久切换到char而不是wchar_t和字符串而不是wstring。我可以使用unicode支持,它是否会影响不同平台和语言的可扩展性和可移植性。
请告知。
答案 0 :(得分:3)
您需要决定使用哪种编码。一些注意事项:
如果您可以使用非ASCII字符,那么选择ASCII或8位ANSI是没有意义的。这种方式会导致失望并导致数据丢失。
选择一种编码并坚持下去是有道理的。到处。 Windows API在支持ANSI和Unicode方面很不寻常,但这是由于旧软件的向后兼容性。如果微软从头开始,那么只会有一个编码。
Unicode编码最常见的选择是UTF-8和UTF-16。任何体面的环境都会得到支持。任何一种选择都是合理的。
Java,VB,C#和Delphi都对UTF-16有很好的支持,所有这些都使用UTF-16作为原生字符串类型(在Delphi的情况下,本机字符串类型是UTF-16仅在Delphi 2009及更高版本中。对于早期版本,您可以使用WideString
字符串类型。
大多数操作系统平台本身都是UTF-16(* Nix系统,如Linux,而不是UTF-8),因此最简单的方法就是使用UTF-16。
另一方面,UTF-8可能是技术上更好的选择,面向字节,向后兼容8位ASCII。很可能,如果从头开始发明Unicode,那么就没有UTF-16和UTF-8可变长度编码。
您已将问题表述为char
和wchar_t
之间的选择。我认为真正的选择是您的首选编码应该是什么。您还必须注意wchar_t
在某些系统上是16位(UTF-16),而在其他系统上是32位(UTF-32)。它不是便携式数据类型。这就是为什么C ++ 11引入了新的char16_t
和char32_t`数据类型来纠正这种歧义。
答案 1 :(得分:2)
Unicode和简单char之间的主要区别在于代码页。仅使用char*
指针不足以理解字符串的含义。它可以是某种特定的编码,也可以是多字节等。宽字符串没有这些警告。
在许多情况下,国际方面并不重要。在这种情况下,这两种表示之间的差异是最小的。您需要回答的主要问题是:国际化是否对您的图书馆很重要?
答案 2 :(得分:1)
现代Windows编程应该倾向于定义UNICODE
的构建,因此使用宽字符和宽字符API。这对于提高性能(Windows API层后面的转换次数较少或没有),改进的功能(有时ANSI包装器不公开宽函数的所有功能)是理想的,并且通常它避免了无法表示字符的问题不在系统的当前代码页上(因此实际上无法表示非ASCII字符)。
当你不得不与不使用宽字符的东西进行交互时,这可能很困难。例如,虽然Windows API具有宽字符文件名,但Linux文件系统通常使用字节串。虽然这些字节串通常按常规UTF-8,但实施起来很少。如果所讨论的语言不能理解API级别的宽字符,则与其他语言的接口也很困难。理想情况下,此类语言选择了特定的编码,例如UTF-8,允许您在边界处进行转换。
这是一个一般性建议:在内部使用Unicode进行所有处理,并在边界处根据需要进行转换。如果您还不熟悉,最好引用Joel's article on Unicode。