【发布时间】:2012-02-11 16:41:34
【问题描述】:
我运行了相同的代码来确定宽字符串中的字符数。测试的字符串有ascii、数字和韩语。
#include <iostream>
using namespace std;
template <class T,class trait>
void DumpCharacters(T& a)
{
size_t length = a.size();
for(size_t i=0;i<length;i++)
{
trait n = a[i];
cout<<i<<" => "<<n<<endl;
}
cout<<endl;
}
int main(int argc, char* argv[])
{
wstring u = L"123abc가1나1다";
wcout<<u<<endl;
DumpCharacters<wstring,wchar_t>(u);
string s = "123abc가1나1다";
cout<<s<<endl;
DumpCharacters<string,char>(s);
return 0;
}
显而易见的是,Visual C++ 2010 中的 wstring.size() 返回字母的数量(11 个字符),无论它是 ascii 还是国际字符。但是,它在 Mac OS X 中返回 XCode 4.2 中字符串数据的字节数(17 字节)。
请回复我如何获取宽字符串的字符长度,而不是 xcode 中的字节数。
--- 添加于 2 月 12 日 --
我发现 wcslen() 在 xcode 中也返回 17。它在 vc++ 中返回 11。 这是经过测试的代码:
const wchar_t *p = L"123abc가1나1다";
size_t plen = wcslen(p);
--- 添加于 2 月 18 日 --
我发现 llvm 3.0 导致长度错误。将编译器前端从 llvm3.0 更改为 4.2 后,此问题已修复
【问题讨论】:
-
size()在std::string的情况下给出以字节为单位的大小(chars),在std::wstring的情况下给出wchar_t的大小。两者都不会给你字符串中的数字字符。 -
你的“明显的事情”是错误的。