将wchar_t转换为char

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (214)

我想知道这样做是否安全?

wchar_t wide = /* something */;
assert(wide >= 0 && wide < 256 &&);
char myChar = static_cast<char>(wide);

如果我很确定宽字符将落在ASCII范围内。

提问于
用户回答回答于

您正在寻找wctomb():它符合ANSI标准,因此您可以依赖它。它甚至在wchar_t使用255以上的代码时也能工作。你几乎肯定不想使用它。

wchar_t 一个完整的类型,所以如果你真的这样做,你的编译器不会抱怨:

char x = (char)wc;

因为它是一个整体类型,所以绝对没有理由这样做。如果你不小心阅读了Herbert Schildt的C:The Complete Reference,或任何基于它的C书,那么你就完全被误导了。字符应该是类型int 或更好。这意味着你应该写这个:

int x = getchar();

而不是这个:

char x = getchar(); /* <- WRONG! */

就整体类型而言,char是没有价值的。你不应该用char创建带有类型参数的函数,也不应该创建类型的临时变量

char*对于字符串来说可能是一个方便的typedef,但是将它想象为“字符数组”或“指向字符数组的指针”是一个新手错误 - 尽管cdecl工具说的是什么。将它视为一个真实的字符数组,像这样废话:

for(int i = 0; s[i]; ++i) {
  wchar_t wc = s[i];
  char c = doit(wc);
  out[i] = c;
}

是荒谬的错。它不会做你想要的; 它以微妙和严肃的方式划分,不同的表现在不同的平台,你肯定会混淆了地狱,你的用户。如果你看到这个,你正在尝试重新实现wctombs(),这已经是ANSI C的一部分,但它仍然是错误的

真的在寻找iconv(),它将一个字符串从一个编码(即使它被打包成一个wchar_t数组)转换成另一个编码的字符串。

现在去看看这个,了解iconv有什么问题。

用户回答回答于

扫码关注云+社区

领取腾讯云代金券