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

时间:2009-04-03 22:32:41

标签: language-agnostic ide unicode encoding character-encoding

我正在尝试理解围绕字符编码的实用编程的基础知识。

需要考虑的一些事项:

  • 我知道如何读取编码不同的文件,并将其转换为控制台的编码。
  • 但是当我尝试转换出现在源代码中的文字字符串时,出于某种原因,它并不总是有效:
    • 在IntelliJ的clojure语言控制台(其REPL或交互式解释器)中,它根本不起作用。我不知道这个特定的控制台是否与IntelliJ的标准java控制台不同。
    • 在Apple的终端中,它有时可以正常工作,具体取决于源文件的编码。
    • 在Eclipse和Netbeans中,它总能正常工作。

有很多资源可以学习Unicode和字符编码。但AFAIK,学习实际使用指南并不多。 StackOverflow上的其他一些问题很有用,但没有一个能够满足我的目的。

更新 在了解了我所面临的问题的一般性之后,我已经大大简化了这个问题。最初,它专门针对Java平台,使用clojure语言的代码示例。要查看这些内容,请查看此问题的第一个版本。

4 个答案:

答案 0 :(得分:2)

您的问题与IDE如何告诉Java编译器解释源文件的编码有关。 (控制台输出可能是另一个问题。不知道)

如果你运行没有参数的javac程序,你会得到一个帮助打印(下面除外),提示你它是如何工作的。

 -encoding <encoding>       Specify character encoding used by source files

因此,Javac解释源文件及其文字字符串,并将其转换为UTF8,我想在字节代码中。我确定Closure编译器有类似的选项。

在Eclipse中,决定编码源文件的选项在General&gt;下。工作区&gt;文本文件编码。在我的瑞典Windows机器下,所选的默认值为CP1252。 (我不在乎那里有什么,因为我完全没有使用ASCII以外的字符。)

答案 1 :(得分:2)

作为必须能够解决此类问题的知识记录,这里有一些亮点:

  1. 验证程序使用的每个文件的编码。这包括源文件数据文件,可以在本地或任何网络上获取。
    1. 确保读取文件的内容知道各自的编码:
      • 如果您使用IDE ,请验证它用于以下设置的编码:
        • IDE范围编码
        • 项目范围编码
        • 模块范围编码
        • 及其特定于文件的编码。
        • 当然,您可能希望使用独特的编码对它们进行标准化。
      • 如果您在IDE 之外使用任何类型的构建工具或编译器,请验证其设置。
    2. 确保读取数据文件的内容知道各自的编码。您将使用编程语言的功能从原始编码中解码每个数据文件。
  2. 验证您的程序生成的每种字符数据的用户需要什么编码。您将使用编程语言的功能对所有内容进行编码:
    • 用户界面
    • 您的程序创建或修改的文件,包括:
      • 网络通讯
      • 记录文件。
  3. 其他人提供的以下提示可能非常有用:

    • 请勿使用默认的平台编码,除非您确实非常确定。
    • 首选带有自己编码信息的格式。 XML就是一个很好的例子:所有有效的XML文件都有一个非常清晰的编码;解析它们不依赖于某些外部手段指定的编码。

    另请参阅以下学习资源:

    要扩大主题,请参阅What Issues prevent Java applications from working on multiple platforms?

答案 2 :(得分:1)

除了您展示的代码不是Java之外,我建议您查看ICU(http://site.icu-project.org/)Java和C ++中提供的开源Unicode库。

答案 3 :(得分:1)

-encoding的{​​{1}}选项告诉编译器源文件使用哪种字符编码。

IDE通常默认使用平台字符编码,但可以设置为使用您指定的编码。然后他们又迈出了一步,让你覆盖单个文件的编码。

如果您的编辑器或IDE使用的是平台默认值之外的其他内容,那么您使用其他工具编译或编辑文件,则需要确保两个工具都明确指定了相同的编码。