wcslen() 在 Xcode 和 VC 中的工作方式不同++
我发现 VC++2010 中的 wcslen()
返回正确的字母计数;而 Xcode 则不然。 例如,下面的代码在 VC++ 2010 中返回正确的 11,但在 Xcode 4.2 中返回错误的 17。
const wchar_t *p = L"123abc가1나1다";
size_t plen = wcslen(p);
我猜 Xcode 应用程序将 wchar_t
字符串作为 UTF-8 存储在内存中。这又是一件奇怪的事。
我怎样才能像Xcode中的VC++一样得到11?
I found that wcslen()
in VC++2010 returns correct count of letters; meanwhile Xcode does not.
For example, the code below returns correct 11 in VC++ 2010, but returns incorrect 17 in Xcode 4.2.
const wchar_t *p = L"123abc가1나1다";
size_t plen = wcslen(p);
I guess Xcode app stores wchar_t
string as UTF-8 in memory. This is another strange thing.
How can I get 11 just like VC++ in Xcode too?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我在运行 MacOS X 10.7.2 (Xcode 4.2) 的 Mac Mini 上运行此程序:
当我对源文件进行十六进制转储时,我看到:
使用 GCC 编译时的输出为:
请注意,字符串在零处被截断byte - 我认为这可能是系统中的一个错误,但我似乎不太可能在第一次尝试使用
wprintf()
时找到一个错误,所以更有可能是我我在做 有事吗。没错,在多字节 UTF-8 源代码中,字符串占用 17 个字节(8 个一字节基本 Latin-1 字符,以及 3 个字符,每个字符使用 3 个字节编码)。因此,源字符串上的原始
strlen()
将返回 17 个字节。GCC 版本是:
只是为了咯咯笑,我尝试了
clang
,但得到了不同的结果。编译使用:使用:
使用
clang
编译时的输出是:所以,现在字符串显示正确,但长度给出为 17 而不是 11。表面上,您可以选择 bug - string看起来不错(在终端 - /Applications/Utilities/Terminal - 适应 UTF8),但长度错误,或者长度正确但字符串显示不正确。
我注意到,
gcc
和clang
中的sizeof(wchar_t)
都是 4。左手不明白右手在做什么。我认为有理由声称两者都以不同的方式被破坏了。
I ran this program on a Mac Mini running MacOS X 10.7.2 (Xcode 4.2):
When I do a hex dump of the source file, I see:
The output when compiled with GCC is:
Note that the string is truncated at the zero byte - I think that is probably a bug in the system, but it seems a little unlikely that I'd manage to find one on my first attempt at using
wprintf()
, so it is more likely I'm doing something wrong.You're right, in the multi-byte UTF-8 source code, the string occupies 17 bytes (8 one-byte basic Latin-1 characters, and 3 characters each encoded using 3 bytes). So, the raw
strlen()
on the source string would return 17 bytes.GCC version is:
Just for giggles, I tried
clang
, and I get a different result. Compiled using:using:
The output when compiled with
clang
is:So, now the string appears correctly, but the length is given as 17 instead of 11. Superficially, you can take your choice of bugs - string looks OK (in a terminal - /Applications/Utilities/Terminal - acclimatized to UTF8) but length is wrong, or length is right but string does not appear correctly.
I note that
sizeof(wchar_t)
in bothgcc
andclang
is 4.The left hand does not understand what the right hand is doing. I think there's a case for claiming both are broken, in different ways.