2009-05-26 101 views
7

我有一個MySQL表,120,000行以UTF-8格式存儲。有一個字段,產品名稱,其中包含許多重音的文本。在將其轉換爲URL友好形式(ASCII)後,我需要使用相同的名稱填充第二個字段。iconv用「聰明的引號」給出了「非法字符」 - 如何擺脫它們?

由於PHP不直接處理UTF-8,我使用的是:

 
$value = iconv ('UTF-8', 'ISO-8859-1', $value); 

的名稱爲ISO-8859-1,其次是一個巨大的聲明的strstr轉換通過更換任何重音字符它的不相關的等價物(例如à變成a)。

然而,原始文本名稱用智能引號進入和iconv扼流圈每當它遇到一個 - 我得到:

 
Unknown error type: [8] 

iconv() [function.iconv]: Detected an illegal character in input string 

要使用的iconv之前擺脫智能引號的,我曾嘗試用三句話一樣:

 
$value = str_replace('’', "'", $value); 

(A€™是UTF-8的智能單引號的原始值)

由於文本文件是這麼久,這些str_replace函數的事業日e腳本每次都會超時。

  1. 什麼是去掉從UTF-8字符串中的智能引號(或任何無效字符),運行的iconv之前,最快的方法是什麼?

  2. 或者,有沒有更容易解決這個問題?以UTF-8格式將帶有許多重音的名稱轉換爲不帶重音的名稱,以ASCII格式正確拼寫的最快方法是什麼?

+2

你試過iconv()的// TRANSLIT能力了嗎?它應該將重音字符轉換爲可讀的ASCII等價物。 – ceejayoz 2009-05-26 16:39:36

+0

我正在查看文檔,但我不明白它將如何幫助 - 如果iconv()已經扼殺了智能報價,如果我使用// TRANSLIT,它會不會窒息? – 2009-05-26 16:45:30

+0

這更適用於你的「大規模的strstr聲明」 - 這就是爲什麼我發表評論而不是回答。 – ceejayoz 2009-05-26 16:59:08

回答

2

「鏈接友好」是什麼意思?只有這樣我纔有意義,因爲<a>...</a>標籤之間的文本可以是任何東西,實際上是「URL友好」的,類似於SO的URL,其中所有東西都被轉換爲[a-z-]

如果這就是你要做的,你需要一個音譯庫,而不是一個字符集轉換庫。 (過去我沒有讓iconv()做這項工作,但我還沒有嘗試過。)有一個測試PHP擴展translitprobably does the job

如果你不能添加擴展到你的PHP安裝,你將不得不尋找一個PHP庫來做同樣的事情。我沒有使用它,但PHP UTF-8庫實現了一個utf8_to_ascii庫,我假設你做了類似你需要的東西。如果iconv()失敗,就像你說的那樣,這意味着你的輸入實際上並不是有效的UTF-8,所以用其他任何東西代替有效的UTF-8都不會有助於解決這個問題。編輯:我可以回想一下:如果ephemient's answer是正確的,你看到的iconv錯誤很可能是因爲目標字符集中沒有字符的直接表示。所以,從來不知道。)

0

你有沒有考慮過使用MySQL的REPLACE字符串函數將有問題的字符串更改爲撇號或其他?您可以將「要替換的字符串」部分放在一起,例如在CHAR上使用CONCAT調用...

6

Glibc(和GNU libiconvsupports//TRANSLIT//IGNORE後綴。

因此,在Linux上,這工作得很好:

 
$ echo $'\xe2\x80\x99' 
’ 
$ echo $'\xe2\x80\x99' | iconv -futf8 -tiso8859-1 
iconv: illegal input sequence at position 0 
$ echo $'\xe2\x80\x99' | iconv -futf8 -tiso8859-1//translit 
' 

我不知道什麼是iconv通過PHP的使用,但文檔意味着//TRANSLIT//IGNORE將在那裏工作過。