我正在使用std :: wstring变量(C ++语言)&我试图确定字符串的长度(以字符为单位)。
功能.length& .size()给出的结果不是字符的长度(我想他们告诉我有多少宽字符?)。
那么有没有办法确定wstring的字符长度?
答案 0 :(得分:6)
“字符”是什么意思?
std::basic_string
只是一系列值的容器,我们认为它是一个字符串。它不关心值是什么 encoding ;它所做的就是存储和管理有序的值序列。因此,size
和length
函数表示它存储了多少个值。
如果您的std::wstring
包含表示有效的UTF-16编码字符串的字符串,则std::wstring
无关紧要。 Unicode编码只是编码代码点的方法。 UTF-16使用16位代码单元对其代码点进行编码,代码点可以包括对应于单个Unicode代码点的16位值的代理对。
但是,Unicode代码点不是该术语的某些定义的“字符”。例如,存在组合代码点,其中多个代码点被组合以形成字形。有不可见的代码点(控制代码等)。
如果您想知道std::wstring
中有多少个代码点,那么您必须使用可以处理UTF-16数据的函数来遍历该字符串。如果您想知道字符串中有多少字形(逻辑字形),那么您需要使用更复杂的算法来处理它。
答案 1 :(得分:5)
要执行此操作,您必须使用Unicode数据库。您应该使用ICU(how to do it in ICU)或其他一些Unicode库。 Boost.Locale已被接受提升并将很快推出,它以一种很好的方式包含了ICU的一些功能。
然而,我怀疑你确实需要这样做。见definitions of grapheme, character, codepoint, codeunit。可能你的意思是代码点,但几乎可以肯定它不是很有用。
答案 2 :(得分:2)
根据字符串的来源,您可能没有任何控制的含义,即它是如何编码的。要将字符串转换为明确的语义,您可能必须执行以下步骤:
通过argv
或getenv
从环境中读取字节字符串。这是一个具有平台和区域设置相关编码的字节字符串。
通过mbstowcs()
将字节字符串转换为内部固定宽度(有警告)宽字符串。 你仍然不知道结果的编码!所有你知道的是,每个宽字符都足以容纳任何“平台的字符值”,无论这意味着什么。 (在Windows中,它意味着broken)。
通过使用ICU或iconv()
将WCHAR转换为UCS-4 / UTF-32,获取一系列Unicode代码点(即可以按码点操作的确定数据)。现在你知道你在做什么了!
如果您正在从具有文档编码的文件或网络中读取数据,则应将文档编码转换为UCS-4。
获得一系列代码点后,文本处理的低级语言支持将结束。一系列代码点是您在二进制级别获得的最佳代码,用于表示文本。任何更高级别的文本操作和处理都是复杂和微妙的,并且在很大程度上取决于对“文本”的正确定义,因此最好留给专用的Unicode库(例如ICU)。在编程语言层面,“字符”是代码点,但在任何严重的应用程序中,可能不是你想要的,你想知道关于字素和规范化以及其他一百个小东西。
答案 3 :(得分:0)
你在找wcslen吗?
#include <wchar.h>
size_t wcslen(const wchar_t *s);