【问题标题】:Default Encoding and changes默认编码和更改
【发布时间】:2013-10-18 08:35:09
【问题描述】:

默认情况下,CharacterString 使用 UTF-16,但是,出于所有实际目的,在北美和大多数英语语言环境中,UTF-8 就足够了(因为它最多可以达到 4 个字节)。那么,如果我使用InputStreamReader(InputStream),那么它会给我默认的UTF-16 char 编码吗?使用 InputStreamReader(InputStream, "UTF-8") 将提供 UTF-8 编码,这足以满足我的目的。

如何在使用英语语言环境时将我的 JVM 的默认编码自动设置为 UTF-8?其目的是提高 CharacterString 操作的性能(通过使用 8 位方案而不是 16 位编码,并且大多数 ASCII 使用 8 位编码覆盖,同时符合 Unicode 标准)。

感谢任何 cmets。谢谢!

【问题讨论】:

  • 我不是实际运行时环境处理字符串方式的专家,但我认为不可能改变这一点,除非您希望创建自己的 UTF-8 字符串类实现。 N.B:通过将 UTF-8 提供给 InputStreamReader 构造函数,您不会更改处理本地 java (char) 对象和字符串的方式,您只需更改输入数据的解析方式。无论您如何操作,数据都将以 UTF-16 格式保存在 RAM 中。
  • @CPUTerminator,感谢您的有用评论。你知道java类文件的编码是什么吗?是UTF-8节省空间吗?
  • 类文件的“编码”可以通过不同的编译器选项来改变。如果您使用 IDE,它应该在构建属性中的某处可用。
  • @CPUTerminator,如果它始终是 16 位原生 JAVA,那么出于效率目的在 InputStreamReader 上设置另一个编码是否有意义?我会理解它在 OutputStreamWriter 上确实有意义。你的想法!!
  • 这不是效率问题。如果您的输入源以 UTF-16 编码,将字符集编码设置为 UTF-8 将导致解析的数据无效。同样,如果数据是 UTF-8 并且您将字符集编码设置为 UTF-16,它将尝试将两个不同的字符作为一个符号读取。输入流的字符编码参数并不是可选的,因为它对如何处理数据有很大的影响,因此这里的基本问题不是效率而是正确性。

标签: java unicode encoding utf-8


【解决方案1】:

所以,如果我使用 InputStreamReader(InputStream),那么它会给我 默认 UTF-16 字符编码?使用 InputStreamReader(InputStream, "UTF-8") 将提供 UTF-8 编码,这足以满足我的 目的。

如何在使用时将我的 JVM 的默认编码自动设置为 UTF-8 英语语言环境?

来自InputstreamReaderjava 文档:

InputStreamReader 使用的字符集可以通过名称或 可以明确给出,或者平台的默认字符集可以是 接受

就像我尝试使用reader.getEncoding() 在我的平台上打印一样;它打印UTF-8。 Java 在 JVM 启动时通过调用System.getProperty("file.encoding") 来获取字符编码。因此,如果 Java 没有获得任何 file.encoding 属性,它会使用 "UTF-8" 字符编码来实现所有实际目的。但是要为 JVM 实例设置编码,可以使用System.setProperty("file.encoding, "UTF-16"")

Here is a useful article with more details.

【讨论】:

  • 你带来了一个很好的观点。那么,如果我使用您的代码设置系统属性,那么我还需要执行 InputStreamReader(InputStream,“UTF-8”)吗?如果我在程序启动时调用 System.setProperty("file.encoding","UTF-8") 一次,那么它是否成为该 JVM 实例的全局默认值?
  • 我也想问你,设置 System.setProperty("file.encoding","UTF-8") 后,它只是 UTF-8 的数据操作,但实际上,本机,无论如何,JAVA 还是会使用 UTF-16。那么,如果我想使用 UTF-32,那么我是否必须再次执行 InputStreamReader(InputStream,“UTF-32”)?我认为答案可能很明显,但如果您能确认,那就太好了
  • for 1 问:不,如果您设置系统属性,则不必在读取器构造函数中为您设置的 JVM 实例设置它。 2问:check this article once i bookmarked.
  • 再次感谢。非常有用的链接。还有一个问题,你知道java类文件的编码是什么吗?是UTF-8节省空间吗?
  • 据我所知是“UTF-8”
【解决方案2】:

java 中文本、char、Character 和 String 的内存数据类型是 UTF-16。绝对地。总是。无条件。

您唯一可以更改的是 Java 如何从外部字节转换为内部字符。无法将表示更改为 UTF-8 以换取时间。

【讨论】:

  • @bmarguiles,谢谢。这有帮助。转换仅用于解析数据,而不是如何保存数据。
  • 你知道java类文件的编码是什么吗?是UTF-8节省空间吗?
  • 如果它始终是 16 位原生 JAVA,那么为了提高效率在 InputStreamReader 上设置另一个编码是否有意义?我会理解它在 OutputStreamWriter 上确实有意义。你的想法!!
  • 这与效率无关。阅读器编码必须告诉它磁盘上字节的格式
猜你喜欢
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 2020-10-19
相关资源
最近更新 更多