java - 从多种语言读取数据时如何避免垃圾字符?

标签 java php mysql utf-8 character-encoding

我正在解析 10 多种不同语言的 RSS 新闻提要。

在我用 php 编写的 API 响应客户端之前,所有解析都是在 java 中完成的,数据存储在 MySQL 中。

我在读取数据时经常遇到垃圾字符。

我尝试过什么:

  1. 我有configured my MySQL存储utf-8数据。我的数据库、表甚至列都将 UTF8 作为默认字符集。
  2. 在连接我的数据库时,我设置了 character set results as utf-8

当我手动运行 jar 文件来插入数据时,字符显示正常。但是当我为同一个 jar 文件设置一个 cronjob 时,我开始再次面临这个问题。

在英语中,我特别面临类似this这样的问题。而在其他白话里,这个字就显得很乱,一个字我都认不出来。

我有什么遗漏的吗?

垃圾字符示例:

古吉拉特语 :"રેલવે મà«àª¸àªªàª«àª°à«€àª®àªªª‚ સપª®àªªàªù ચà«àª°à «€ થશે ત૪®àª3શે વળતર!"

马拉雅拉姆语:“ഴേപàµà´ªà´ªà´3ിലേകàµà´•àµà´³àµà´³ à´•àµ´à ´³àµâ€ à´´à´¿à´°à´•àµà´•àµ à´•àµà´±à´šàµà´šàµ"

中文:银行董事会局的范围扩大到金融部门事业单位

最佳答案

古吉拉特语开始રેલવે,对吗?马拉雅拉姆语以 നേപ 开头,对吗?英语中应该包括 Bureau's

这是一个经典案例

  • 客户端中的字节已正确编码为 utf8。 (Bureau 采用 utf8 的 Ascii/latin1 子集进行编码;但 ' 不是 ascii 撇号。)
  • 您可能默认使用SET NAMES latin1(或set_charset('latin1')或...)进行连接。 (应该是 utf8。)
  • 表中的列被声明为CHARACTER SET latin1。 (或者可能是从表/数据库继承的。)(应该是 utf8。)

数据修复是“两步更改”。

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...;
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...;

其中长度足够大,而另一个“...”有其他任何内容(NOT NULL等)已经在列上。

不幸的是,如果您有很多列需​​要处理,则需要进行大量的 ALTER。您可以(应该)将一对ALTERs中的单个表的所有必需列MODIFYVARBINARY

代码的修复是建立utf8作为连接;这取决于 PHP 中使用的 api。 ALTERs 将更改列定义。

编辑

您的 VARCHARCHARACTER SET 不正确。因此,您看到的 Mojibake 类似于 રેલ。大多数转换技术都会尝试保留 રેલ,但这不是您所需要的。相反,采取 VARBINARY 的步骤会保留这些位,同时忽略表示 latin1 编码字符的位的旧定义。第二步再次保留这些位,但现在声称它们代表 utf8 字符。

关于java - 从多种语言读取数据时如何避免垃圾字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29881114/

相关文章:

java - 是否可以在Java程序(如Soundflower)上进行编码?

PHP fopen 响应失败

php - 我如何检查表名在 Propel 中是否有效?

mysql - 如何使用哈希 ('sha256' 和 $salt 创建一个 mySQL 用户。 $密码)?

java - 链接列表 : Iterator vs List Iterator

java - BufferedReader,读取编辑文本中的字符给出奇怪的字符

php - 如何获取以给定字母开头的自定义帖子类型的帖子?

php & mysql 下拉选项选择问题

php - 在最后 50 个条目中仅选择 5 个随机行

java - weblogic 10.3 上的 ClassCastException jboss-seam