【问题标题】:What is an appropriate text encoding?什么是合适的文本编码?
【发布时间】:2011-07-03 18:08:33
【问题描述】:

我的客户端和服务器之间的通信是 UTF-8 格式的 XML。然而,最近我在数据库中发现了一个非 UTF-8 字符——整个数据库中只有一个字符。显然它需要被保存。

但是,我不想将客户端和服务器之间的所有消息都更改为 UTF-16,因为它们会突然变大一倍,只是为了一个杂散的 unicode 字符。

我可以使用更有效的文本编码吗?也许仍然会以 8 位传输大多数 ASCII 字符,但仍会允许以某种方式发送非 UTF-8 字符?

【问题讨论】:

  • 为什么不手动将一个非 UTF-8 字符更改为 UTF-8?
  • @Matt Ball 最终,角色仍然需要完好无损地到达客户那里。我当然可以手动将任何非 UTF-8 字符更改为其他字符以进行手动传输,然后在客户端将其更改回来,但我想也许有一种编码可以为我做这件事。
  • @Matt: UTF-8 Unicode。它将 ASCII 字符编码为 8 位,并且它支持您本机谈论的任何字符。没有“非 UTF-8 字符”,因为 UTF-8 几乎涵盖了人类已知的所有字符。
  • 当你说非 UTF8 字符时,你到底是什么意思?可能存在格式错误的 UTF8 流(请参阅 UTF8 维基百科页面上的无效字节序列)。如果 UTF8 格式不正确,那么您将无法重新编码为任何其他方案。
  • 谢谢大家,我认为这是我在这方面缺乏经验的表现:) 我会回去重新审视我正在做的事情。

标签: xml encoding utf-8 character-encoding


【解决方案1】:

不要混淆 UTF-8 和 ASCII。 UTF-8 一种 Unicode 编码。如果你真的支持 UTF-8,那么这个 Unicode 字符不会引起任何问题。

如果你错误地说你支持 UTF-8,而实际上你只支持 ASCII,那么你应该以支持 UTF-8 为目标。

【讨论】:

  • 抱歉,当我说“但是,我在数据库中发现了一个 unicode 字符”时,我的意思是“我发现了一个非 utf-8 字符”。我将编辑我的问题。
  • 我的意思是 UTF-8 支持您找到的任何字符。假设您已经确定它没有正确通过,我想说您只需要确保您真正支持 UTF-8。忘记 UTF-16。
  • 对不起,我不是文本编码方面的专家,我仍然不明白 :) 数据库中一个人的名字有这个字符:ñ 在 Java 中,当我执行 stringToSend.getBytes (),此字符已损坏。但如果我执行 stringToSend.getBytes(Charset.forName("UTF-16")),那么我的传输大小会翻倍。
  • 你试过stringToSend.getBytes(Charset.forName("UTF-8"))吗?你知道 UTF-16 不能代表 UTF-8 不能代表的任何东西吗?
  • 不,老实说我没有意识到,我认为这是我对两者区别的根本误解。我认为我认为 UTF-8 和 Ascii 是一回事。这个问题已经教会了我很多。
【解决方案2】:

有没有更高效的 我可以使用文本编码吗?也许一个 这将传输大多数 ASCII 字符仍为 8 位?

正是 utf-8 是什么。

【讨论】:

  • 抱歉,我应该说“也许仍然会以 8 位传输大多数 ASCII 字符,但仍允许以某种方式发送非 UTF-8 字符?”。我将编辑我的问题。
  • 那么它不是你需要的编码,它是一个不关心你通过它发送什么的通信通道。另请参阅上面 Jimmy 的评论。
【解决方案3】:

UTF-8 已经支持完整的 Unicode 目录,它可能是在 Unicode 中存储西方语言的最有效编码。您发现的错误不是由于包含不受支持的字符:而是由于包含无效字符(即编码错误)。

虽然理论上要求 XML 不包含错误,但拒绝完整数据几乎不是一种选择,因为可能存在不关心数据有效性的供应商。我的建议是记录无效字符,默默地丢弃它们,然后警告供应商。

【讨论】:

    【解决方案4】:

    我认为你应该试着理解为什么“这个角色需要被保留”。

    您的数据库的编码是什么?如果是 UTF-8,那么它可能只包含 UTF-8 字符。

    您是否以 到 utf-8 的编码存储字符的 UTF-8 二进制表示?

    您应该坚持使用 utf-8 并更彻底地了解您的编码链。

    【讨论】:

    • 相信我,我现在明白了很多!我错误地假设问题出在我的 XML 编码器或 DB 上,但事实上,这是我的通信渠道。我以为 Java 的 String.getBytes() 转换为 UTF-8,但事实并非如此 - 哎呀!
    【解决方案5】:

    没有非 UTF-8 字符这样的东西。 UTF-8 可以编码存在的每个字符,即 Unicode 中的每个字符。确实,存在不是任何字符的 UTF-8 编码的八位字节序列;但那是相当不同的。我怀疑您收到一条错误消息,指出无法将传入的八位字节流解码为 UTF-8。当发送者以 iso-8859-1 编码数据而接收者期望它以 UTF-8 编码时,就会发生这种情况。

    【讨论】:

      猜你喜欢
      • 2014-10-05
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多