Visual C++/MFC:让日文字符在没有 UNICODE 的情况下工作
Posted
技术标签:
【中文标题】Visual C++/MFC:让日文字符在没有 UNICODE 的情况下工作【英文标题】:Visual C++/MFC: getting Japanese characters to work without UNICODE 【发布时间】:2015-08-17 15:19:34 【问题描述】:我的软件最初是在 20 年前使用没有 UNICODE 的 MFC 使用 Visual C++ 开发的。目前字符串保存在 char[] 或 CString 中,它可以在英语和日语 Windows PC 上工作,直到使用日语字符,因为这些往往会转换为奇怪的字符或空框。
设置 UNICODE 可能是前进的方向,但需要大量更改代码,而只需将系统区域设置设置为日本(在“非 Unicode 程序的 Window 语言”设置中),似乎很多工作。我不知道 Windows 是如何做到这一点的,但是一些日文字符现在可以在我的英文 Windows PC 上运行,例如我无需更改代码即可打开和保存日文文件名。在日本,他们将 System Locale 设置为英语并再次进行了很多工作,但并非全部。
我觉得问题是由于使用了不包含日文字符的字体造成的。目前我正在使用 Arial / MS Sans Serif 并将字符集设置为 ANSI_CHARSET 或 DEFAULT_CHARSET。我应该使用其他字体吗,或者我可以扩展这些字体以包含日文字符吗?或者我是在吠叫错误的树,在这种情况下我下一步该怎么做?不幸的是,我对这一切都很陌生……
【问题讨论】:
自 Windows NT 以来,Windows 本身就是 Unicode。这意味着非 unicode 程序使用 MultiByteCharactersSets 并且这些字符在内部被转换为它们的 unicode 等效项以进行显示。因此,如果您使用的字体不显示您使用的所有字符,您将得到正方形而不是预期的字符。但问题也可能是由错误的语言 ID 引起的。如果没有minimal reproducible example,就很难猜出问题出在哪里... 【参考方案1】:这是一个常见的问题(好吧,我想在 2015 年不再那么常见了,幸运的是 MBCS 课程是一个垂死的品种 - 但我仍然坚持几个......)
无论哪种方式,恐怕,根据您对“工作”的定义,要使其正常工作,您必须硬着头皮转换为 Unicode 版本。如果您不能为此制定商业案例,那么您将不得不设置正确的语言环境(好吧,更糟糕的是,让用户设置“正确”的语言环境)并测试哪些有效,哪些无效,并询问更多关于什么不是的具体问题。
如果您的目标是创建一个应用程序,无论计算机上的区域设置如何,都能以“正确”方式正确显示各种编码的字符串,并且与每个输入数据集/数据库内容兼容,而无需用户注意编码问题,那么您在构建 MBCS 时就不走运了。
字体缺少字符很可能不是问题所在。在您进一步和/或提出更多问题之前,您应该阅读http://www.joelonsoftware.com/articles/Unicode.html,再读一遍,睡在上面,再读一遍,向其他人解释“编码”之间的关系, 'locale', 'character set', 'font' 和 'Unicode code point',因为只有在你能做到这些之后,你才能决定如何推进你的应用程序。抱歉,这不是您想听到的,但如果您的任务是处理国际化,这就是现实。
【讨论】:
这篇文章非常有帮助 - 谢谢!我无法转换为 Unicode - 这是一项太大的任务,但我有很多东西可以很快完成。一问。我是否对 lfCharSet 使用 DEFAULT_CHARSET 或 SHIFTJIS_CHARSET?该软件只需要以英语和日语运行,并且将在系统区域设置为日本的英语 Windows 操作系统和日语 Windows 操作系统上使用。我已将所有内容转换为使用 Meiryo 字体,包括以前为 MS Sans Serif 的所有对话框。以上是关于Visual C++/MFC:让日文字符在没有 UNICODE 的情况下工作的主要内容,如果未能解决你的问题,请参考以下文章
无法让CImage在Visual C ++ 2005(MFC)中工作
在 Visual Studio MFC 中,我可以在组合框中包含文本但在代码中获取 int 吗?
从多字节字符集转换旧的Visual Studio C ++项目