2015-04-26 113 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

見編輯....... –