fwprintf不输出宽字符

时间:2012-10-15 16:23:14

标签: c printf standard-library widestring

我想将宽字符输出到文件中,而fwprintf不会这样做,即使它被描述为这样做。示例代码:

const char *testFileName = "/Users/jdmuys/wideTestFile.txt";
FILE *wideTestFile;
wideTestFile = fopen(testFileName, "w");
fwide(wideTestFile, 1);
fwprintf(wideTestFile, L"12345");
fclose(wideTestFile);

根据我的十六进制转储实用程序,我的文件“wideTestFile.txt”恰好包含5个字节:31 32 33 34 35

我怀疑当前语言环境存在一些问题,因为fwprintf可能调用fwprintf_l,它将语言环境作为附加参数。

我一直在阅读如何使用最后一次调用,但我无法理解我需要传递的语言环境。文档相当模糊(或者我可能无法理解)。

为什么fwprintf没有记录的任何解释?以及fwprintf_l使用的任何示例?

非常感谢,

JD

这是Mac OS X 10.8.2下的Xcode 4.5.1,目标是来自Objective-C代码的iOS 6.0。但这些都不重要。

2 个答案:

答案 0 :(得分:0)

我打算在这里猜一下。

它以UTF-8保存。现在,对于大多数ASCII字符,ASCII中的表示和UTF-8中的表示完全相同。现在,在UTF-8中,第一个字节的高位编码“字符”的长度。例如,高达0x7F的所有内容都适合一个字节(即标准ASCII),两个字节中的0x7FF以及接通和打开。有关详细信息,请参阅http://en.wikipedia.org/wiki/UTF-8#Description

要“修复”您的问题,只需使用UTF-8表格中较高的字符。

从前面提到的维基百科页面中删除一些例子:

  • $应该适合单个字节
  • ¢以两个字节显示
  • €in three
  • in four

答案 1 :(得分:0)

你的语言环境可能是UTF-8的一些变体,这意味着当打印宽字符(即ascii代码0 - 127之外的字符)时,输出只会是 wide

如果您想强制进行宽幅打印(例如UTF-16LE),则需要使用libiconvThis answer有点说明了为什么它不倾向于做你认为它做的事情。