你如何处理不同的字符编码?
Posted
技术标签:
【中文标题】你如何处理不同的字符编码?【英文标题】:How do you handle different character encodings? 【发布时间】:2009-04-03 22:32:40 【问题描述】:我正在尝试了解有关字符编码的实用编程的基础知识。
需要考虑的几点:
我知道如何读取编码不同的文件,并将其转换为控制台的编码。 但是当我尝试转换出现在源代码中的文字字符串时,出于某种原因,它并不总是有效: 在 IntelliJ 的clojure
语言(它的 REPL 或交互式解释器)控制台中,它根本不起作用。我还没有查看这个特定的控制台是否与 IntelliJ 的标准 java 控制台不同。
在 Apple 的终端中,有时可以正常工作,具体取决于源文件的编码。
在 Eclipse 和 Netbeans 中,它始终可以正常工作。
有很多资源可以了解 Unicode 和字符编码。但是 AFAIK,学习实际使用指南的内容并不多。 *** 上的其他一些问题很有用,但对于我正在尝试做的事情来说,这些问题都还不够。
更新:
在了解了我所面临的问题的普遍性之后,我大大简化了这个问题。最初,它专门针对Java
平台,带有clojure
语言的代码示例。要查看这些内容,请查看此问题的第一个版本。
【问题讨论】:
【参考方案1】:您的问题与您的 IDE 如何告诉 Java 编译器解释源文件的编码有关。 (控制台输出可能是另一个问题。不知道)
如果您在没有参数的情况下运行 javac 程序,您会得到一个帮助打印(下面是excert),提示您它是如何工作的。
-encoding <encoding> Specify character encoding used by source files
Javac 因此解释源文件及其文字字符串和所有内容,将其转换为我认为在字节码中的 UTF8。我确信 Closure 编译器也有类似的选项。
在 Eclipse 中,决定源文件编码的选项位于 General > Workspace > Text file encoding 下。在我的瑞典 Windows 机器下,选择的默认值是 CP1252。 (我不在乎那里有什么,因为正是出于这个原因,我避免使用 ASCII 之外的字符。)
【讨论】:
我认为这是一个问题。不过,我要到星期一才能确认。 Java 的编译器使用系统平台的默认值读取源文件。 Clojure 使用 UTF8 代替。关于它的好帖子:groups.google.com/group/clojure/browse_thread/thread/… 你说得对。我更改了源文件的编码以及我的 IDE 用于读取它们的编码,以便所有内容都匹配。它没有解决我在一个环境中遇到的问题,但我现在明白这是一个与控制台输出相关的问题,我可能会将其作为错误提交给它的作者。 (也就是说,看起来特定的控制台只支持ASCII字符,或者其他一些未记录的编码。)谢谢你的帮助。 好的。那很有意思。我想隔离错误源总是好的。很高兴能帮上忙!:D【参考方案2】:作为能够解决这类问题的好知识记录,这里有一些亮点:
-
验证程序使用的每个文件的编码。这包括源文件和数据文件,无论是在本地还是在任何网络上获取。
-
确保读取源文件的内容知道它们各自的编码:
如果您使用 IDE,请验证它用于以下设置的编码:
IDE 范围 编码
项目范围编码
模块范围编码
及其文件特定编码。
当然,您可能希望使用唯一的编码对它们进行标准化。
如果您在 IDE 之外使用任何类型的构建工具或编译器,请验证其设置。
确保读取 data 文件的内容知道它们各自的编码。您将使用编程语言的功能从原始编码解码每个数据文件。
其他人提供的以下提示可能非常有用:
不要使用默认的平台编码,除非你真的非常确定你的意思。 首选带有自己编码信息的格式。 XML 就是一个很好的例子:所有有效的 XML 文件都有一个非常明确定义的编码;解析它们不依赖于某些外部方式指定的编码。另请参阅以下学习资源:
Jon Skeet 的 Debugging Unicode Problems 文章,其中包含更多技术上的技巧。 Jon Skeet applies his knowledge to Java.要扩大主题,请参阅What Issues prevent Java applications from working on multiple platforms?。
【讨论】:
我会添加“更喜欢带有自己编码信息的格式”。 XML 就是一个很好的例子:所有有效的 XML 文件都有一个非常明确定义的编码,并且解析它们不依赖于某些外部方式指定的编码。 谢谢 saua;我会相应地编辑。另外,我认为您可以自己编辑此答案;对于任何希望这样做的人,请继续,即使这意味着将其作为社区答案。 (不习惯这个,想确保你可以随意这样做。)【参考方案3】:除了您显示的代码不是 Java 之外,我建议您查看 ICU (http://site.icu-project.org/),它是 Java 和 C++ 中可用的开源 Unicode 库。
【讨论】:
哇,看起来棒极了,谢谢!我不知道它是否能帮助我解决我的问题,但我肯定会在了解如何在没有 ICU 的情况下解决我的问题后立即尝试 ICU。【参考方案4】:javac
的-encoding
选项告诉编译器源文件使用什么字符编码。
IDE 通常默认使用平台字符编码,但可以设置为使用您指定的编码。然后他们又走了一步,让您覆盖单个文件的编码。
如果您的编辑器或 IDE 使用的不是平台默认设置,那么您使用不同的工具编译或编辑文件,您需要确保两个工具都明确指定了相同的编码。
【讨论】:
我现在可以更好地了解这一切的流程,谢谢。它肯定会有所帮助。所以作为一个开发者,在编译之前我需要和我的平台保持一致。从那里开始,我需要与用户的平台保持一致。对吗? 没错;当您将输出发送到控制台时(在用户机器上运行时),您需要确保您使用的是控制台的编码,这通常是平台的默认值。以上是关于你如何处理不同的字符编码?的主要内容,如果未能解决你的问题,请参考以下文章
PHP - 如何处理“utf-16”、us-ascii 编码的 html 字符串以正确保存在 DomDocument 中?