2015-04-26 81 views
0

我解析新闻来自超过10种不同的语言饲料。如何从多种语言读取数据时避免垃圾/垃圾字符?

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

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

有什么我想:

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

当我手动运行jar文件中插入数据时,人物的出现很好。但是当我为同一个jar文件设置一个cronjob时,我开始再次面对这个问题。

在英语中,我特别面临诸如this和其他地方语言的问题,该字符看起来完全是垃圾,我甚至无法识别单个字符。

有什么,我失踪?

样品乱码:

古吉特拉:“ર的«‡àª²àªμેમà«àª¸àª¾àª«àª°的«€àª®àª¾àª,સામાન ચà«<ર的«€àª¥àª¶à«‡àª¤à«<મળશેàªμળતર!”

Malyalam:“à'¨àμ‡à'ªàμà'ªà'¾à'³à'¿à'²àμ‡A'•àμà'•àμà'³àμà'³A'•Aμ<à'³àμâ€à '¨à'¿à'°A'•àμà'•AμA'•àμà'±à'šàμà'šàμ”

英语:银行董事会Bureau’的范围扩大到金融行业事业单位

+0

jar文件如何汇编它插入数据库的数据?通过stdin?通过文件? – Siguza

+0

如果您需要特定帮助,您需要显示一些代码。 – jtahlborn

+2

这里猜测,但系统默认代码页(由“cron”拾取)可能是“C”。即普通的旧式ASCII。把你的java包装在一个设置环境“LANG = UTF-8”的脚本中。或者在你的java代码中显式地打开UTF-8文件。 –

回答

2

的古吉拉特开始રેલવે,是否正确? Malyalam开始നേപ,对吗?英文应该包括Bureau’s

这是

  • 经典的情况下,你在客户端拥有的字节UTF8正确编码。 (Bureau编码在utf8的Ascii/latin1子集中;但不是ASCII字符撇号。)
  • 您可能与SET NAMES latin1(或set_charset('latin1')或...)连接,可能是默认情况。 (它应该是utf8。)
  • 表中的列被宣布为CHARACTER SET latin1。 (也可能将其从表/数据库继承。)(它应该是utf8。)

修复用于数据是“两步骤ALTER”。

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

,其中长度足够大,其他的“...”有任何其他(NOT NULL等)已经在列。

不幸的是,如果你有很多需要处理的列,它将需要大量的ALTER。你可以(应该)MODIFY所有必要的列VARBINARY为一对ALTERs中的单个表。

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

编辑

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

+0

为什么VARBINARY?我目前正在使用varchar。 –

+0

见编辑....... –