如何在从多种语言中读取数据时避免使用垃圾/垃圾字符?

我正在解析来自10多种不同语言的RSS新闻源。

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

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

我试过了什么:

  1. 我已将MySQL配置为存储utf-8数据。 我的db,table甚至列都有UTF8作为它们的默认字符集。
  2. 连接我的数据库时,我将字符集结果设置为utf-8

当我手动运行jar文件以插入数据时,角色看起来很好。 但是当我为同一个jar文件设置一个cronjob时,我又开始面对这个问题了。

在英语中,我特别面对像这样的问题,在其他本地语言中,这个角色看起来完全是垃圾,我甚至无法识别单个角色。

有什么我想念的吗?

样本垃圾字符:

古吉拉特语 :“રેàªààªμેàªàà«àªàààààà«àªàà€ààààªààààààààààààààààààààààààààààààààà««àà€« ¤à«<મળશેàªμળતર!“

Malyalam :“à’ààμ‡à’ªàμà’ªà’¾à’³à’¿à’²àμ‡à’ààμà’àààààààààààààààààààààààààà’àà’àà ‘°à’•àμà’•àμà’ààμà’±à’šàμà’šàμ“

英语 :银行局局扩大金融部门PSU的范围

古吉拉特人开始રેલવે ,对吗? 而Malyalam开始നേപ ,对吗? 英语应该包括Bureau's

这是经典案例

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

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

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

其中长度足够大而另一个“……”还有其他任何东西( NOT NULL等)已经在列上。

不幸的是,如果你有很多列可以使用,它将需要很多ALTER。 对于一对ALTERs的单个表,您可以(应该) MODIFY VARBINARY所有必要列。

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

编辑

你有VARCHAR错误的CHARACTER SET 。 因此,你会看到像’ રેલ 。 大多数转换技术都试图保留રેલ ,但这不是你需要的。 相反,向VARBINARY采取步骤会保留位,同时忽略表示latin1编码字符的位的旧定义。 第二步再次保留位,但现在声称它们代表utf8字符。