Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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
C++ 使用Windows API处理Unicode字符串_C++_Winapi_Unicode - Fatal编程技术网

C++ 使用Windows API处理Unicode字符串

C++ 使用Windows API处理Unicode字符串,c++,winapi,unicode,C++,Winapi,Unicode,我一直认为Unicode字符串处理是一门黑暗的艺术。但是,例如,我已经看到Windows API具有比较Unicode字符串的函数。这是否意味着编写一个Unicode字符串类实际上是可行的,它可以执行排序、相等比较和从文件中提取等简单操作?或者在使用这些函数的过程中有没有隐藏的陷阱,使得它实际上是一个非常糟糕的主意?我只是看看像ICU这样的库,与Windows API支持的Unicode字符串类的实际外观相比,它们似乎过于复杂,这与标准字符串类非常相似。Unicode是未来的发展方向,例如,他们

我一直认为Unicode字符串处理是一门黑暗的艺术。但是,例如,我已经看到Windows API具有比较Unicode字符串的函数。这是否意味着编写一个Unicode字符串类实际上是可行的,它可以执行排序、相等比较和从文件中提取等简单操作?或者在使用这些函数的过程中有没有隐藏的陷阱,使得它实际上是一个非常糟糕的主意?我只是看看像ICU这样的库,与Windows API支持的Unicode字符串类的实际外观相比,它们似乎过于复杂,这与标准字符串类非常相似。

Unicode是未来的发展方向,例如,他们已经说过“一些较新的函数只支持unicode版本”。标记“更新”一词。例如,Net字符串类是unicode,Java字符串类也是unicode

使用unicode并不是一门黑暗的艺术,实际上它使使用不同的语言变得非常容易。在我的一个业余项目中,我使用JSP接受两种语言(用户选择)的词典的用户输入,然后用Java处理它们(排序、提取子字符串、搜索、连接),最后使用JDBC将它们写入数据库。之后,我可以从数据库中搜索和检索它们,处理它们并将它们显示在http页面上。我必须配置我的开发环境以支持UTF-8,并一致地使用UTF-8,但从我这样做的那一刻起,这适用于操作系统支持的每种语言/键盘布局,我甚至不再费心了。包括日语、阿拉伯语、德瓦纳加里语、俄语。一个简单的鼠标点击改变键盘布局和程序的工作原理是一样的。这适用于linux、windows xp、windows 7,无论是32位还是64位。我正在使用的DB在所有这些环境中都支持这一点,开发环境(eclipse/Java)也是如此。我再也不在乎了。当然,如果您对阿拉伯语字符串进行排序,您应该了解阿拉伯语、排序算法以及正在使用的字符串类的字符串比较。但这通常是有记录的

配置开发环境当然意味着您知道与之相关的地方。这些包括但不限于您将要使用的字符串类、编辑器使用的编码、正在使用的模板(用于XML、HTML、资源文件等)的编码、数据库表等等,。。。。但是,一旦您使用一致且仅使用一个字符编码进行设置,这将是一个非常强大且非常易于使用的设置

您甚至不必担心unicode的细节。如果您这样做,您将发现,例如,您可以找到某个区域设置中的所有字符位于哪个范围内,并且您可以通过提取该字符范围从unicode字符串中提取所有阿拉伯文本。真可爱

关键是在整个解决方案中始终使用一种编码。如果有不同的编码在使用,你不知道它,这很可能成为一个严重头痛的根本原因。如果你有意识地同时使用不同的字符编码,并且效果正确,那么实际上这可能接近于某种黑暗艺术:-),如果你必须链接到不支持它的库,你需要使用它。当然,这同样适用于不一致使用它的图书馆

(当然,即使您使用的是一种特定的编码,您也必须特别熟悉您正在使用的字符串类。因此,如果您不需要对多种语言的支持,最简单的方法就是使用您的语言环境的默认设置)

这是否意味着编写一个Unicode字符串类实际上是可行的,它可以执行排序、相等比较和从文件中提取等简单操作

对。C#、Java、.Net、Python(列表还在后面)都有Unicode字符串作为基本类型,甚至带有类似ICU的库的C/C++都有这种类型

或者在使用这些函数的过程中有没有隐藏的陷阱,使得它实际上是一个非常糟糕的主意

是的,有陷阱。在“坏主意”上少一些是的。让我们以您发布的示例为例:“排序、相等比较和从文件中提取”

  • 从文件中提取:如果您知道文件的编码字符,则此任务非常简单。大多数语言都提供了一些方法来读取文件,并将字节转换为该语言的“Unicode”类型。(例如,在python中,
    data=file\u handle.read()
    从文件中读取,然后
    data.decode(对我的文件进行编码)
    返回
    unicode
    字符串对象。(或python 3中的
    str

  • 相等性比较:这里的情况有点复杂。Unicode的基本构造块是“代码点”。Unicode字符串只不过是一系列代码点。但是,Unicode包括与前一个字符组合的重音符号的代码点,但也有一些带有重音符号的代码点“precomposed”.é可能是2个代码点(e+accute)或1个代码点。如果我有两个字符串,一个是2个代码点版本,另一个是1个代码点版本…它们是相同的吗?答案可能取决于你想要什么。同样,如果你有一个字符有多个重音(在越南语中很常见),重音可以是任意顺序

    关键?你必须知道你想要什么类型的相等。不区分大小写的相等操作使这更有趣,因为不同的语言对字母的大小写版本有不同的想法。也就是说,Unicode定义并提供了按特定顺序获取代码点的方法(一种规范化字符串的方法)使这些事情变得更容易。像ICU这样的库,甚至一些语言的标准库,都有这些