我的问题似乎困扰了人们。下面是具体的东西:如何从UNICODE应用程序写入MBCS文件?
我们的代码执行以下操作:
FILE * fout = _tfsopen(_T("丸穴種類.txt"), _T("w"), _SH_DENYNO);
_fputts(W2T(L"刃物種類\n"), fout);
fclose(fout);
在MBCS构建目标,上述产生的代码页932(假设932是系统默认代码页时,这是一个正确编码文件跑)。
在UNICODE构建目标下,上面产生了一个充满了????的垃圾文件。
我想定义一个符号,或者使用一个编译器开关,或者包含一个特殊的头文件或链接到一个给定的库,以使上述内容在编译目标是UNICODE时不需要改变源代码就能继续工作。
这里的,因为它曾经存在这样的问题:
FILE*
流可以在叔打开(ranslated)或b(inary)模式。 桌面应用程序可以编译为UNICODE或MBCS(在Windows的 下)。如果我的应用程序被编译为MBCS,然后写MBCS字符串到 “重量”流中包含MBCS文本 为系统代码页格式良好的文本文件的结果(即代码页“非Unicode的 软件”)。
因为我们的软件普遍采用的最串& 流功能_t版本,在MBCS建立输出由
puts(pszMBString)
或类似的东西putc
等主要处理由于pszMBString
已经在系统代码页(如932,当运行在日本机器上的 ),字符串被逐字写出 (尽管线终结符自动按puts
和gets
)。但是,如果我的应用程序被编译为UNICODE,然后写MBCS 字符串为“重量”流导致垃圾(大量的“?????” 字符)(即我的UNICODE转换为系统的默认代码 ,页面,然后使用例如
fwrite(pszNarrow, 1, length, stream)
)将其写入流。
我可以打开我的二进制模式流,在这种情况下,我会得到正确的 MBCS文本......但是,该行终止不再是 PC风格的CR + LF,而是将只是UNIX样式的LF。这是因为 处于二进制(非转换)模式,因此文件流不处理LF-> CR + LF转换。
但我真正需要的,是能够产生我以前可以编译为MBCS时产生完全相同的文件:正确 行结束符和MBCS文本文件使用系统的代码页。
显然我可以自己手动调整行终止符,并使用 二进制流。但是,这是一种非常有侵入性的方法,因为我现在需要在整个系统中找到编写文本 文件的所有代码,并对其进行修改,以便正确执行所有这些操作。我脑海中挥之不去的是,UNICODE的目标是否比我们曾经使用过的MBCS目标更能干!当然,有一种方法可以将C 库切换为“原样输出窄字符串,但正确处理行终止符,正如您在MBCS编译中所做的一样”?!
你的计划是,如果你需要写一个未在当前MBCS编码所能表述的Unicode字符?如果你绝对需要坚持使用MBCS,为什么还要用'UNICODE'编译(大概是'_UNICODE')呢?或者为什么不直接调用“ANSI”版本的函数?就个人而言,我将切换到UTF-8作为数据文件格式,并提供一个迁移工具来转换现有的数据。 – jamesdlin
请提供一个简短的代码示例。 – dalle
您是否使用特定于Windows的_t函数宏,如_tfopen和_fputts或fopen/_wfopen和fputs/fputws函数? – dalle