如何在从多种语言中读取数据时避免使用垃圾/垃圾字符?
我正在解析来自10多种不同语言的RSS新闻源。
所有解析都是在java中完成的,数据存储在MySQL中,然后我用PHP编写的API响应客户端。
当我读取数据时,我经常遇到垃圾字符。
我试过了什么:
- 我已将MySQL配置为存储utf-8数据。 我的db,table甚至列都有UTF8作为它们的默认字符集。
- 连接我的数据库时,我将字符集结果设置为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字符。