用于创建API的wchar\u t vs char 我创建了一个C++库,它可以与不同的应用程序一起使用,如java、C语言、Delphi等。
我时不时地被困在wstring、string、char*、wchar\u t*之间的转换上。例如,我坚持使用wchar_t,但不得不使用regex库,该库接受字符和其他类似问题 我希望使用w或普通字符串。我的库主要处理ASCII字符,但也可以有非ASCII字符,如名称等。因此,我可以永久性地切换到char而不是wchar\u t,以及string而不是wstring。我是否可以使用unicode支持,它是否会影响跨不同平台和语言的可伸缩性和可移植性用于创建API的wchar\u t vs char 我创建了一个C++库,它可以与不同的应用程序一起使用,如java、C语言、Delphi等。,c,winapi,C,Winapi,我时不时地被困在wstring、string、char*、wchar\u t*之间的转换上。例如,我坚持使用wchar_t,但不得不使用regex库,该库接受字符和其他类似问题 我希望使用w或普通字符串。我的库主要处理ASCII字符,但也可以有非ASCII字符,如名称等。因此,我可以永久性地切换到char而不是wchar\u t,以及string而不是wstring。我是否可以使用unicode支持,它是否会影响跨不同平台和语言的可伸缩性和可移植性 请告知。您需要决定使用哪种编码。一些考虑:
请告知。您需要决定使用哪种编码。一些考虑:
- 如果可以使用非ASCII字符,那么选择ASCII或8位ANSI是没有意义的。这样会导致失望,并有数据丢失的风险
- 选择一种编码并坚持下去是有意义的。到处都是。Windows API在同时支持ANSI和Unicode方面是不寻常的,但这是由于旧软件的向后兼容性。如果微软从零开始,就只有一种编码
- Unicode编码最常见的选择是UTF-8和UTF-16。任何良好的环境都会支持这两个方面。任何一种选择都是合理的
- Java、VB、C#和Delphi都对UTF-16有很好的支持,并且都使用UTF-16作为其本机字符串类型(对于Delphi,本机字符串类型仅在Delphi 2009和更高版本中为UTF-16。对于早期版本,您可以使用
string类型)WideString
- 大多数操作系统平台本机都是UTF-16(*Nix系统,比如Linux,都是UTF-8),因此只使用UTF-16可能是最简单的
- 另一方面,UTF-8在技术上可能是一个更好的选择,它面向字节,向后兼容8位ASCII。很有可能,如果Unicode是从零开始发明的,那么就不会有UTF-16,UTF-8将是可变长度编码
您已将该问题表述为在
char
和wchar\u t
之间进行选择。我认为,真正的选择是您首选的编码应该是什么。您还必须注意,wchar\u t
在某些系统上是16位(UTF-16),但在其他系统上是32位(UTF-32)。它不是可移植的数据类型。这就是为什么C++11引入了新的char16\u t
和char32\u t`数据类型来纠正这种歧义。您需要决定使用哪种编码。一些考虑:
- 如果可以使用非ASCII字符,那么选择ASCII或8位ANSI是没有意义的。这样会导致失望,并有数据丢失的风险
- 选择一种编码并坚持下去是有意义的。到处都是。Windows API在同时支持ANSI和Unicode方面是不寻常的,但这是由于旧软件的向后兼容性。如果微软从零开始,就只有一种编码
- Unicode编码最常见的选择是UTF-8和UTF-16。任何良好的环境都会支持这两个方面。任何一种选择都是合理的
- Java、VB、C#和Delphi都对UTF-16有很好的支持,并且都使用UTF-16作为其本机字符串类型(对于Delphi,本机字符串类型仅在Delphi 2009和更高版本中为UTF-16。对于早期版本,您可以使用
string类型)WideString
- 大多数操作系统平台本机都是UTF-16(*Nix系统,比如Linux,都是UTF-8),因此只使用UTF-16可能是最简单的
- 另一方面,UTF-8在技术上可能是一个更好的选择,它面向字节,向后兼容8位ASCII。很有可能,如果Unicode是从零开始发明的,那么就不会有UTF-16,UTF-8将是可变长度编码
您已将该问题表述为在
char
和wchar\u t
之间进行选择。我认为,真正的选择是您首选的编码应该是什么。您还必须注意,wchar\u t
在某些系统上是16位(UTF-16),但在其他系统上是32位(UTF-32)。它不是可移植的数据类型。这就是为什么C++11引入了新的char16\u t
和char32\u t`数据类型来纠正这种歧义。Unicode和简单字符的主要区别在于代码页。只有char*
指针不足以理解字符串的含义。它可以是特定的编码,也可以是多字节的,等等。宽字符串没有这些警告
在许多情况下,国际方面并不重要。在这种情况下,这两种表示之间的差异最小。您需要回答的主要问题是:国际化对您的库是否重要?Unicode和简单字符的主要区别在于代码页。只有
char*
指针不足以理解字符串的含义。它可以是特定的编码,也可以是多字节的,等等。宽字符串没有这些警告
在许多情况下,国际方面并不重要。在这种情况下,这两种表示之间的差异最小。您需要回答的主要问题是:国际化对您的库是否重要?现代Windows编程应该倾向于使用定义了
UNICODE
的构建,从而使用宽字符和宽字符API。这有助于提高性能(Windows API层后面的转换更少或没有转换)、提高功能(有时ANSI包装器不会公开wide函数的所有功能),并且通常可以避免无法表示系统当前代码页上没有的字符的问题