Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于创建API的wchar\u t vs char 我创建了一个C++库,它可以与不同的应用程序一起使用,如java、C语言、Delphi等。_C_Winapi - Fatal编程技术网

用于创建API的wchar\u t vs char 我创建了一个C++库,它可以与不同的应用程序一起使用,如java、C语言、Delphi等。

用于创建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支持,它是否会影响跨不同平台和语言的可伸缩性和可移植性 请告知。您需要决定使用哪种编码。一些考虑:

我时不时地被困在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。对于早期版本,您可以使用
    WideString
    string类型)

  • 大多数操作系统平台本机都是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。对于早期版本,您可以使用
    WideString
    string类型)

  • 大多数操作系统平台本机都是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函数的所有功能),并且通常可以避免无法表示系统当前代码页上没有的字符的问题