wstring里装的是unicode编码,具体编码方式是UTF16,是变长编码,怎么获取里面实际的字符个数?win32有api实现吗?

时间:2022-03-04 15:53:19
注意,是获取字符个数,不是获取wchar_t个数。

UTF16是变长编码,大部分字符用2个字节表示,其余则需要用长于2个字节来表示。

12 个解决方案

#1


不是UTF-16
win下是UCS2,是定长编码
*nix下是UTF-32,也是定长的

#2


不可能的,UCS2是两个字节最多表示65536个字符,但Unicode字符表,已经增加到11万多个字符了。

win是utf16,变长编码。

引用 1 楼 zhangsongcui 的回复:
不是UTF-16
win下是UCS2,是定长编码
*nix下是UTF-32,也是定长的

#3


查了资料,UCS2就是UTF-16,是变长编码。


引用 1 楼 zhangsongcui 的回复:
不是UTF-16
win下是UCS2,是定长编码
*nix下是UTF-32,也是定长的

#4


刚才说错了,但Unicode字符表,应该四已经增加到110多万个字符了。

#5


UTF16不是变长编码,它是采用固定的2个字节存储一个符号。

UTF8才是变长编码,一个符号可能用1个字节、2个字节、3个字节或者四个字节表示,具体区分方法为:
对于单字节的符号,字节的第一位(最高位)设为0,对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。

#6


Unicode字符表,已经增加到110多万个字符了。 不可能两个字节,完全不够用。



引用 5 楼 u012654340 的回复:
UTF16不是变长编码,它是采用固定的2个字节存储一个符号。

UTF8才是变长编码,一个符号可能用1个字节、2个字节、3个字节或者四个字节表示,具体区分方法为:
对于单字节的符号,字节的第一位(最高位)设为0,对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。

#7


UTF16是变长编码

引用 5 楼 u012654340 的回复:
UTF16不是变长编码,它是采用固定的2个字节存储一个符号。

UTF8才是变长编码,一个符号可能用1个字节、2个字节、3个字节或者四个字节表示,具体区分方法为:
对于单字节的符号,字节的第一位(最高位)设为0,对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。

#8


引用 3 楼 u012680653 的回复:
查了资料,UCS2就是UTF-16,是变长编码。


Quote: 引用 1 楼 zhangsongcui 的回复:

不是UTF-16
win下是UCS2,是定长编码
*nix下是UTF-32,也是定长的


UCS和UNICODE是不同的字符集

国际标准 ISO 10646 定义了通用字符集 (Universal Character Set)。它是与UNICODE同类的组织,UCS-2和UNICODE兼容,UCS有UCS-2和UCS-4两种格式,分别是2字节和4字节.

UNICODE字符集具体编码又分为UTF8、UTF16和UTF32,其中UTF8为变长,UTF16和UTF32分别用2个和4个字节存储符号。

#9



请单步调试一下,看wstr里面有多少个汉字,然后在看看size_Bytes结果是两个字节,还是四个字节。

int b[2] = {0xdc3ad866, 0};
wchar_t * b1 = (wchar_t *)(&b);
std::wstring wstr = b1;
int size_Bytes = wstr.size() * 2;


引用 8 楼 u012654340 的回复:
Quote: 引用 3 楼 u012680653 的回复:

查了资料,UCS2就是UTF-16,是变长编码。


Quote: 引用 1 楼 zhangsongcui 的回复:

不是UTF-16
win下是UCS2,是定长编码
*nix下是UTF-32,也是定长的


UCS和UNICODE是不同的字符集

国际标准 ISO 10646 定义了通用字符集 (Universal Character Set)。它是与UNICODE同类的组织,UCS-2和UNICODE兼容,UCS有UCS-2和UCS-4两种格式,分别是2字节和4字节.

UNICODE字符集具体编码又分为UTF8、UTF16和UTF32,其中UTF8为变长,UTF16和UTF32分别用2个和4个字节存储符号。

#10


请单步调试一下,看wstr里面有多少个汉字,然后在看看size_Bytes结果是两个字节,还是四个字节。

int b[2] = {0xdc3ad866, 0};
wchar_t * b1 = (wchar_t *)(&b);
std::wstring wstr = b1;
int size_Bytes = wstr.size() * 2;


引用 1 楼 zhangsongcui 的回复:
不是UTF-16
win下是UCS2,是定长编码
*nix下是UTF-32,也是定长的

#11


UTF16我记得除了surrogate pairs其他都是一个字符2字节啊。如果我没记错的话,那计算长度的逻辑只是判断字符是不是surrogate pair,是的话那2个2字节算1个字符,否则就1个2字节算1个字符。这逻辑简单到自己都可以写。

#12


win里有无api可实现?

引用 11 楼 FancyMouse 的回复:
UTF16我记得除了surrogate pairs其他都是一个字符2字节啊。如果我没记错的话,那计算长度的逻辑只是判断字符是不是surrogate pair,是的话那2个2字节算1个字符,否则就1个2字节算1个字符。这逻辑简单到自己都可以写。

#1


不是UTF-16
win下是UCS2,是定长编码
*nix下是UTF-32,也是定长的

#2


不可能的,UCS2是两个字节最多表示65536个字符,但Unicode字符表,已经增加到11万多个字符了。

win是utf16,变长编码。

引用 1 楼 zhangsongcui 的回复:
不是UTF-16
win下是UCS2,是定长编码
*nix下是UTF-32,也是定长的

#3


查了资料,UCS2就是UTF-16,是变长编码。


引用 1 楼 zhangsongcui 的回复:
不是UTF-16
win下是UCS2,是定长编码
*nix下是UTF-32,也是定长的

#4


刚才说错了,但Unicode字符表,应该四已经增加到110多万个字符了。

#5


UTF16不是变长编码,它是采用固定的2个字节存储一个符号。

UTF8才是变长编码,一个符号可能用1个字节、2个字节、3个字节或者四个字节表示,具体区分方法为:
对于单字节的符号,字节的第一位(最高位)设为0,对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。

#6


Unicode字符表,已经增加到110多万个字符了。 不可能两个字节,完全不够用。



引用 5 楼 u012654340 的回复:
UTF16不是变长编码,它是采用固定的2个字节存储一个符号。

UTF8才是变长编码,一个符号可能用1个字节、2个字节、3个字节或者四个字节表示,具体区分方法为:
对于单字节的符号,字节的第一位(最高位)设为0,对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。

#7


UTF16是变长编码

引用 5 楼 u012654340 的回复:
UTF16不是变长编码,它是采用固定的2个字节存储一个符号。

UTF8才是变长编码,一个符号可能用1个字节、2个字节、3个字节或者四个字节表示,具体区分方法为:
对于单字节的符号,字节的第一位(最高位)设为0,对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。

#8


引用 3 楼 u012680653 的回复:
查了资料,UCS2就是UTF-16,是变长编码。


Quote: 引用 1 楼 zhangsongcui 的回复:

不是UTF-16
win下是UCS2,是定长编码
*nix下是UTF-32,也是定长的


UCS和UNICODE是不同的字符集

国际标准 ISO 10646 定义了通用字符集 (Universal Character Set)。它是与UNICODE同类的组织,UCS-2和UNICODE兼容,UCS有UCS-2和UCS-4两种格式,分别是2字节和4字节.

UNICODE字符集具体编码又分为UTF8、UTF16和UTF32,其中UTF8为变长,UTF16和UTF32分别用2个和4个字节存储符号。

#9



请单步调试一下,看wstr里面有多少个汉字,然后在看看size_Bytes结果是两个字节,还是四个字节。

int b[2] = {0xdc3ad866, 0};
wchar_t * b1 = (wchar_t *)(&b);
std::wstring wstr = b1;
int size_Bytes = wstr.size() * 2;


引用 8 楼 u012654340 的回复:
Quote: 引用 3 楼 u012680653 的回复:

查了资料,UCS2就是UTF-16,是变长编码。


Quote: 引用 1 楼 zhangsongcui 的回复:

不是UTF-16
win下是UCS2,是定长编码
*nix下是UTF-32,也是定长的


UCS和UNICODE是不同的字符集

国际标准 ISO 10646 定义了通用字符集 (Universal Character Set)。它是与UNICODE同类的组织,UCS-2和UNICODE兼容,UCS有UCS-2和UCS-4两种格式,分别是2字节和4字节.

UNICODE字符集具体编码又分为UTF8、UTF16和UTF32,其中UTF8为变长,UTF16和UTF32分别用2个和4个字节存储符号。

#10


请单步调试一下,看wstr里面有多少个汉字,然后在看看size_Bytes结果是两个字节,还是四个字节。

int b[2] = {0xdc3ad866, 0};
wchar_t * b1 = (wchar_t *)(&b);
std::wstring wstr = b1;
int size_Bytes = wstr.size() * 2;


引用 1 楼 zhangsongcui 的回复:
不是UTF-16
win下是UCS2,是定长编码
*nix下是UTF-32,也是定长的

#11


UTF16我记得除了surrogate pairs其他都是一个字符2字节啊。如果我没记错的话,那计算长度的逻辑只是判断字符是不是surrogate pair,是的话那2个2字节算1个字符,否则就1个2字节算1个字符。这逻辑简单到自己都可以写。

#12


win里有无api可实现?

引用 11 楼 FancyMouse 的回复:
UTF16我记得除了surrogate pairs其他都是一个字符2字节啊。如果我没记错的话,那计算长度的逻辑只是判断字符是不是surrogate pair,是的话那2个2字节算1个字符,否则就1个2字节算1个字符。这逻辑简单到自己都可以写。