2012-07-18 62 views
1

我一直在尋找我的!!!試圖找到一個PHP函數將UTF8轉換爲相應的數字。我不完全知道該怎麼撥打該號碼(聽說它叫縱座標?),但下面有一個例子:http://jrgraphix.net/r/Unicode/3040-309FUTF8以相當於php的編號

基本上我試圖讀取PHP中的UTF-8文本文件,然後保存每在一個數組中,所以我可以解決它。

如果任何人都可以幫助我,這將是高度讚賞,因爲我不熟悉UTF8呢。

編輯: 這是我到目前爲止有:

echo "var TextCharacters = new Array();\n"; 

$LineArray = array(); 
$file_handle = fopen("lesson1.txt", "r"); 


while (!feof($file_handle)) 
{ 
    $line_of_text = fgets($file_handle); 
    array_push($LineArray, $line_of_text); 
} 

fclose($file_handle); 

foreach($LineArray as $s) 
{ 
    for($i = 0; $i < mb_strlen($s,"utf-8"); $i++) 
    { 
     $char = mb_substr($s, $i, 1, "utf-8"); 
     echo "alert(go(" . bin2hex(iconv('UTF-8', 'UCS-2', $char)) . "));";   
    } 
} 
+0

你是指Unicode代碼點還是UTF-8字節表示? – 2012-07-18 12:02:21

+0

請參閱http://php.net/ord上的註釋,瞭解與'ord()'等效的各種Unicode代碼點。 – deceze 2012-07-18 12:07:02

+0

我的意思是unicode代碼點。 – user1534664 2012-07-18 12:12:28

回答

4

您正在尋找的是Unicode代碼點,即Unicode字符表中已知字符的數字標識符。該「最便宜的」的方式來做到這一點是通過UCS-2的字符編碼,它映射1:從字節1對Unicode碼點:

echo bin2hex(iconv('UTF-8', 'UCS-2', 'あ')); 
// 3042 

注意事項:返回的代碼總是4個十六進制位長(其你可以或不可以)並且UCS-2不支持高於BMP的字符,即高於代碼點FFFF。

+1

非常感謝,欺騙。這個功能是我所需要的。所有這些UTF8 UNICODE UCS2的東西都讓我頭疼。我不確定iconv做什麼,但我會在一會兒做一些研究。 – user1534664 2012-07-18 13:08:39

+0

'iconv'在不同的字符集之間轉換。您可能對[每個程序員都絕對肯定,需要了解編碼和字符集以處理文本]感興趣(http://kunststube.net/encoding/)作爲入門。 – deceze 2012-07-18 13:10:04

+0

我有另一個問題。我讀出了UTF-8文本文件,並用日文字符填滿了它:あ。現在我有一個數組,數組中的每個元素都在我的文本文件中包含一行。我想將每個字符單獨轉換爲它們的代碼點,所以我使用str_split()函數將每個句子拆分爲一個字符數組,以便我可以單獨轉換它們。現在,當我回顯每個字符時,它不顯示あ字符,但是當我回顯它的整個行時。這可能意味着str分割函數會改變每個字符的值。如何解決這個問題? – user1534664 2012-07-18 14:10:21

-1

沒有什麼神奇的關於PHP UTF-8。當你讀取文件時,你會得到字節值(而不是解析爲字符)。迭代已讀取的數據並使用ord()來獲取字節的十進制值。

如果要使用UTF-8代碼點執行此操作,可以使用mb_substriconv_substr在使用ord()打印組成字符的每個字節的值之前提取每個字符。

更新:爲完整的解決方案展開:

utf8.test:fooÆØÅござ

$utf8 = file_get_contents("utf8.test"); 

for ($i = 0; $i < mb_strlen($utf8, "utf-8"); $i++) 
{ 
    $char = mb_substr($utf8, $i, 1, "utf-8"); 

    print($char); 
    print("\n"); 

    for ($j = 0; $j < strlen($char); $j++) 
    { 
     print(dechex(ord($char[$j]))); 
    } 

    print("\n\n"); 
} 

輸出:

f 
66 

o 
6f 

o 
6f 

Æ 
c386 

Ø 
c398 

Å 
c385 

ご 
e38194 

ざ 
e38196 

希望有所幫助。

+0

儘管字節不是Unicode碼點,這似乎是OP所要求的。 – deceze 2012-07-18 12:05:57

+0

我修改了我的答案,還包括關於如何在評論之前獲取utf-8代碼點的建議。無論如何感謝您的評論。 :-) – MatsLindh 2012-07-18 12:08:47

+0

*「在使用ord()打印每個字節的值之前提取每個字符」*仍然不給你字符的* Unicode代碼點*儘管... – deceze 2012-07-18 12:22:09