【问题标题】:fwprintf does not output wide charactersfwprintf 不输出宽字符
【发布时间】:2012-10-05 16:11:09
【问题描述】:

我想将宽字符输出到文件,而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 的任何使用示例?

非常感谢,

京东

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

【问题讨论】:

  • 我在Windows上解决了类似的问题,也许你可以从here找到一些有用的东西。

标签: c printf standard-library widestring


【解决方案1】:

我在这里猜测一下。

它以 UTF-8 格式保存。现在,对于大多数 ASCII 字符,ASCII 中的表示和 UTF-8 中的表示完全相同。现在,在 UTF-8 中,第一个字节的高位编码“字符”的长度。例如,直到 0x7F 的所有内容都适合一个字节(即标准 ASCII),0x7FF 适合两个字节,等等。详情请见http://en.wikipedia.org/wiki/UTF-8#Description

要“解决”您的问题,只需使用 UTF-8 表中更高层的字符即可。

从上述维基百科页面中提取一些示例:

  • $ 应该放在一个字节中
  • ¢ 两个字节
  • 三欧元
  • ?四分之二

【讨论】:

  • 没有 UTF-16 语言环境这样的东西。
  • @R.. 该死的,从我上次做这件事的时候起,我的记忆就模糊了(尽管我认为有一种方法可以让语言环境使用 UTF-16)。已更新,谢谢。
【解决方案2】:

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

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

【讨论】:

  • 如果是这种情况,那么fwprintffprintf 做同样的事情,提供它的意义不大,因为它唯一的区别是作为参数传递的格式字符串对于fwprintf 和缩小为 fprintf。您的链接没有说明 为什么 它没有达到我的预期。它基本上说“忘记标准库并使用 iconv”
  • 不,fprintf 不能正确处理宽字符,而 fwprintf 可以。问题是您的示例代码中的最终产品不会产生非 ascii 字符,因此输出将仅使用 ascii 字符。该示例是如何使用 libiconv 从 UTF-16 -> UTF-8 进行转换(即 windows 文件格式转换)。您想完成与此相反的操作 - 您 swprintf 进入缓冲区,使用 iconv 执行转换,然后将 iconv 输出输出到文件。
猜你喜欢
  • 2016-06-26
  • 2018-03-06
  • 2016-03-24
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
相关资源
最近更新 更多