你如何处理不同的字符编码?

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 中?

JAVA是是如何处理字符的。

tomcat 对请求参数中的加号是如何处理的

密码中有特殊的字符IOS如何处理 IOS中URL包含中文参数的问题

分类数据集的 One-hot 编码:如何处理分类数据中的不同值(数量较少)