2012-04-09 68 views
1

這裏的數據是我在窗體中的文本框中輸入的。文本框名稱:quiz_optionA將法語字符轉換爲php中的字符串

value = ÉÉÉabcd. 

我從我的PHP函數的數據如下方式

$this->_data = JRequest::get('post'); 
$string = $this->_data['quiz_optionA']; 

以下方法我用法語轉換成英文

$normalizeChars = array(
'Š'=>'S', 'š'=>'s', 'Ð'=>'Dj','Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A',  'Ã'=>'A', 'Ä'=>'A', 
'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 
'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 
'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss','à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 
'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 
'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 
'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y', 'ƒ'=>'f' 
); 


echo strtr($string, $normalizeChars);die; 

輸出:

A�A�A�abcd 

Normal en glish字母轉換爲字符串。但法國字符沒有轉換成字符串。

輸出應該是EEEabcd。你能幫我做這個嗎?

+0

您的PHP文件是否以您的瀏覽器顯示的相同編碼保存?你有沒有指定編碼的標題? – Jon 2012-04-09 07:42:33

+0

你必須使用多字節字符串函數 http://stackoverflow.com/questions/9986584/dealing-with-non-ascii-string-as-array-and-character – max 2012-04-09 07:42:54

+0

我的編輯使用「cp1252」字符編碼。它顯示我「某些字符不能用」cp1252「字符編碼映射。請更改編碼或刪除」cp1252「字符編碼不支持的字符」。如果我保存爲utf8,它工作正常。任何其他在PHP徹底編碼中將字符轉換爲utf8格式的方法? – ram 2012-04-09 14:06:34

回答

0

今天我已經回答了similar question 所以儘量用html代碼:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

,並確保其包含$ normalizeChars你的PHP文件有utf8編碼。

0

你行

echo strtr($string, $normalizeChars); 

僅轉換您在$normalizeChars指定的字符。你想要翻譯的那個,即É(注意:你在這個問題中沒有定義那個字符的編碼),沒有任何翻譯信息在$normalizeChars

如果您希望這些字符也可以翻譯,您需要將它們添加到$normalizeChars陣列。它看起來像É實際上是A�(如果您添加一個hexdump,我們可以更好地說出這是什麼)。

我會假設如下:

的瀏覽器將輸入到應用程序中的UTF-8編碼。你用一些單字節編碼(non-utf-8)處理它們,這就是爲什麼它不會改變。

編輯:

É; cp1252 #201; LATIN CAPITAL LETTER E WITH ACUTE; U+00C9 

即UTF-8 PHP字符串內編碼:"\xC3\x89"。要將幾乎任何字符編碼爲UTF-8,首先需要在您的編碼中找到您的字符,並且它是unicode codepoint。與您的例子:

Character: É 
Codepoint: LATIN CAPITAL LETTER E WITH ACUTE (U+00C9) 

的碼點可以轉換爲UTF-8具有小的PHP函數:

/** 
* @see Unicode 6.0.0 Ch2 General Structure, rfc3629 
* @param int|string $codepoint e.g. 0xC9/"U+00C9" 
* @return string 
*/ 
function unicodeCodePointToUTF8($codepoint) 
{ 
    is_string($codepoint) && sscanf($codepoint, 'U+%x', $codepoint); 
    if ($codepoint < 0) { 
     throw new InvalidArgumentException('Lower than 0x00.'); 
    } 
    if ($codepoint > 0x10FFFD) { 
     throw new InvalidArgumentException('Larger than 0x10FFFD.'); 
    } 
    if (0xD800 <= $codepoint && $codepoint <= 0xDFFF) { 
     throw new InvalidArgumentException(sprintf('High and low surrogate halves are invalid unicode codepoints (U+D800 through U+DFFF, is U+%04X).', $codepoint)); 
    } 
    if ($codepoint <= 0x7F) { 
     return chr($codepoint); 
    } 
    if ($codepoint <= 0x7FF) { 
     return chr(0xC0 | $codepoint >> 6 & 0x1F) . chr(0x80 | $codepoint & 0x3F); 
    } 
    if ($codepoint <= 0xFFFF) { 
     return chr(0xE0 | $codepoint >> 12 & 0xF) . chr(0x80 | $codepoint >> 6 & 0x3F) . chr(0x80 | $codepoint & 0x3F); 
    } 
    return chr(0xF0 | $codepoint >> 18 & 0x7) . chr(0x80 | $codepoint >> 12 & 0x3F) . chr(0x80 | $codepoint >> 6 & 0x3F) . chr(0x80 | $codepoint & 0x3F); 
} 

用法:

echo bin2hex(unicodeCodePointToUTF8(0x00C9)), "\n"; # c389 

十六進制輸出可以在串被寫入在PHP中用前綴爲\x的雙引號字符串形式表示:

$binary = "\xC3\x89"; 

這種寫作方式不受實際PHP文件編碼的影響。

+0

我的編輯器以「cp1252」字符編碼工作,它顯示「某些字符不能使用」cp1252「字符編碼映射。請更改編碼或刪除」cp1252「字符編碼不支持的字符。我保存爲utf8,它工作得很好。任何其他方式轉換字符作爲UTF8格式在PHP徹底編碼? – ram 2012-04-09 14:06:57

+0

@ram:我擴展了答案。爲了驗證UTF-8是否有效,我將一個問題交叉鏈接起來:[快速去除不能在瀏覽器中顯示的所有字符從utf8字符串](http://stackoverflow.com/a/7635283/367456)(您可能不會需要這個)。 – hakre 2012-04-10 14:24:19