【问题标题】:Java - Converting copyright symbol to ©Java - 将版权符号转换为 ©
【发布时间】:2011-10-04 12:50:04
【问题描述】:

我有一个字符串进来,我需要将它存储在数据库中。现在字符串确实包含版权符号©。我想将其转换为 &copy ;以便它可以在每个浏览器和每个编码标准上正确显示。

这是我到现在为止的地方

- 尝试了 replace(),这对于版权字符来说肯定​​是行不通的。
- 尝试通过设置不同的编码标准来查看浏览器中的数据,它会显示为 �
- 将字符串转换为具有 UTF-8 字符集的字节数组,并发现 -62 是版权字符的 ASCII 值。现在的问题是传入的字符串可能非常大,将其拆分为一个字节数组,然后再形成一个字符串会非常昂贵。

感谢任何帮助。

【问题讨论】:

  • 为什么replace() 不起作用?试了一下,结果如何?
  • 版权字符没有ASCII值,因为ASCII不包含它!
  • 好的.. 现在有些东西已经开始工作了——大部分情况下。现在的问题是显示版权字符。使用 FIREBUG,我看到我的服务器为请求生成的响应确实包含版权字符。它只是没有那样显示; head 确实包含字符集为 utf-8!

标签: java character-encoding


【解决方案1】:

HTML 转义

这可能无法解决您的编码问题,但可以从标题中回答您的问题。

为了对字符串进行 HTML 转义,我推荐 StringEscapeUtils from Apache Commons Lang

StringEscapeUtils.escapeHtml(String)

编码

为了解决您的编码问题..当您想使用UTF-8 时,请确保至少设置了以下一项。此外,当设置多个它们时,它们都必须保持一致。

HTTP-Header 中的内容类型

Content-Type: text/html; charset=utf-8

HTML

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

HTML 5

<meta charset="utf-8">

XHTML

<?xml version="1.0" encoding="UTF-8"?>

还要确保您提供的内容确实是 UTF-8 编码的。我建议使用没有 BOM 的 UTF-8 编码。

【讨论】:

  • 好的.. 现在有些东西已经开始工作了——大部分情况下。现在的问题是显示版权字符。使用 FIREBUG,我看到我的服务器为请求生成的响应确实包含版权字符。它只是没有那样显示; head 确实包含字符集为 utf-8!
  • escapeHtml 搞乱了所有的标签、空格和一切。我只想更改版权符号。 str.replace("\u00a9", "©") 似乎不起作用!
  • 那么只通过那个方法传递版权符号。但是我有点想知道,您的内容仍然需要转义,而其他部分不需要转义。这看起来像是以某种方式混合在一起......或者内容旨在作为 UTF-8 提供,并且“未转义部分”不需要转义,因为使用了字符集。
  • 用一些关于编码的提示更新了我的答案。也许这有助于解决您的编码问题。我建议您首先解决这个问题,因为在解决编码问题时您很有可能不必再担心转义。
【解决方案2】:

为什么要将文本 HTML-Escaped 存储在数据库中?这是为了演示,不属于您的应用程序的核心数据。将字符串存储在您选择的编码中(当然无关紧要,只要它一致并且可以处理您需要的所有字符)并以这种方式处理数据。 Ergo:问题的核心不是数据库。

版权符号未正确显示的问题可能有多种原因。就像您正在向浏览器发送 UTF-8 文本,但适当的 Content-Typeclaims 您的内容是其他编码。

一篇涵盖该主题所有方面的文章会非常广泛,但您可以在网络上找到很好的文档。

不过,如果您坚持存储 HTML 转义数据:string.replace("\u00a9", "&amp;copy;");

【讨论】:

  • 好的.. 现在有些东西已经开始工作了——大部分情况下。现在的问题是显示版权字符。使用 FIREBUG,我看到我的服务器为请求生成的响应确实包含版权字符。它只是没有那样显示; head 确实包含字符集为 utf-8!
【解决方案3】:

试试

result = input.replace("\u00a9", "&copy;");

The copyright symbol in Unicode is hex a9.

【讨论】:

  • replace("\u00a9", "©") 是行不通的!我不知道为什么。在调用替换之前,我将输入字符串转换为 utf-8,以确保所有内容都在 utf8 中。奇怪的是我的浏览器没有显示版权符号 - 即使服务器正确生成并传递响应(我通过 firebug 检查了响应)
  • I converted my input string to utf-8 before calling replace, just to make sure everything is in utf8. 没有意义。字符串不是 any 编码,replace() 是一个 String 方法。你到底做了什么?此外,为了确保它是应有的字符代码,您可以输入一些调试输出/日志,显示该 char 的数值 - 将其转换为 int 并输出。
猜你喜欢
  • 2012-06-15
  • 2020-06-12
  • 2018-01-11
  • 2013-02-01
  • 2013-04-11
  • 2011-09-29
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
相关资源
最近更新 更多