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

时间:2015-04-26 17:41:41

标签: java php mysql utf-8 character-encoding

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

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

我在阅读数据时经常遇到乱码。

我尝试了什么:

  1. 我有configured my MySQL来存储utf-8数据。我的db,table甚至列都有UTF8作为默认字符集。
  2. 连接我的数据库时,我设置了character set results as utf-8
  3. 当我手动运行jar文件以插入数据时,字符显示正常。但是当我为同一个jar文件设置一个cronjob时,我又开始面对这个问题了。

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

    我有什么遗失的吗?

    示例垃圾字符:

    Gujarati :“રેàªààªμેમà«àªàààààà«àª°à€«ààપààààààààààààààààààààààààààààààààààààà «€àªàશેતà«<મળશેàªàà³àªªàª°°!“

    Malyalam :“à'ààμ‡à'ªàμà'ªà'¾à'³à'¿à'²àμ‡à'àààà'ààμà'³àμà'³à'ààμ<à 'àà'à''à'¿à'°à'àààààààààààààààààà'àà'ààààààààà“

    英文:银行董事会扩大金融业PSU的范围

1 个答案:

答案 0 :(得分:2)

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

这是

的经典案例
  • 客户端中的字节在utf8中正确编码。 (Bureau在utf8的Ascii / latin1子集中编码;但不是ascii撇号。)
  • 您可能默认与SET NAMES latin1(或set_charset('latin1')或...)相关联。 (应该是utf8。)
  • 表格中的列已声明为CHARACTER SET latin1。 (或者它可能是从表/数据库继承的。)(应该是utf8。)

修复数据是一个&#34;两步ALTER&#34;。

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

长度足够大而另一个长度足够...&#34; ...&#34;还有其他任何东西(NOT NULL等)已经在列上。

不幸的是,如果您要使用很多列,则需要很多ALTER。对于MODIFY对中的单个表,您可以({should} VARBINARY ALTERs所有必要的列。

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

修改

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