2008-10-03 112 views
3

我有一個問題比較一個數組與挪威字符與UTF8字符。PHP的UTF8問題

除挪威特殊字符(æ,ø,å)以外的所有字符均正常工作。

function isNorwegianChar($Char) 
{ 
    $aNorwegianChars = array('a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F', 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', 'p', 'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', 'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y', 'z', 'Z', 'æ', 'Æ', 'ø', 'Ø', 'å', 'Å', '=', '(', ')', ' ', '-'); 
    $iArrayLength = count($aNorwegianChars); 

    for($iCount = 0; $iCount < $iArrayLength; $iCount++) 
    { 
     if($aNorwegianChars[$iCount] == $Char) 
     { 
      return true; 
     } 
    } 

    return false; 

} 

如果任何人有任何想法我可以做的請求讓我知道。

更新:

之所以需要這個是我試圖解析包含與挪威和中國字線,像一本字典的文本文件。我想把這一行分成字符串,一個包含挪威詞,一個包含中文。這稍後將被插入到數據庫中。示例行:

IMPULSIV形衝動的

imøtegå動反對,反駁

imøtekomme動符合

alkoholmisbruk(ER)名濫用酒精(名濫用酒精的人)

alkoholpåvirket形受酒精影響的

alkotest名呼吸性酒精測試

alkymi(ST)名鍊金術(名煉金術士)

所有,ALT,全部,形全部,所有

正如你可以看到有可能是單詞之間有空格,所以我不能用的東西就像中文和挪威語之間爆炸分裂一樣容易。我所做的是使用isNorwegianChar並遍歷該行,直到找到不在數組中的char。

現在的問題是,它不會作爲挪威語字符返回,它認爲中文字已經開始。

下面是代碼:

所有的
//Open file. 
$rFile = fopen("norsk-kinesisk.txt", "r"); 

// Loop through the file. 
$Count = 0; 
while(!feof($rFile)) 
{ 
    if(40== $Count) 
    { 
     break; 
    } 

    $sLine = fgets($rFile); 

    if(0 == $Count) 
    { 
     $sLine = mb_substr($sLine, 3); 
    } 

    $iLineLength  = strlen($sLine); 
    $bChineseHasStarted = false; 
    $sNorwegianWord  = ''; 
    $sChineseWord  = ''; 
    for($iCount2 = 0; $iCount2 < $iLineLength; $iCount2++) 
    { 
     $char = mb_substr($sLine, $iCount2, 1); 

     if(($bChineseHasStarted === false) && (false == isNorwegianChar($char))) 
     { 
      $bChineseHasStarted = true; 
     } 

     if(false === $bChineseHasStarted) 
     { 
      $sNorwegianWord .= $char; 
     } 
     else 
     { 
      $sChineseWord .= $char; 
     } 

     //echo $char; 
    } 

    $sNorwegianWord = trim($sNorwegianWord); 
    $sChineseWord = trim($sChineseWord); 

    $Count++; 
} 

fclose($rFile); 
+0

什麼PHP的版本? – leek 2008-10-03 12:49:00

+0

PHP版本是5.2.5 – Christoffer 2008-10-03 12:56:46

+1

在構建陣列時,您可能希望使用range()作爲速記。 – 2008-10-03 13:17:43

回答

3

首先,我會得到UTF-8後,如果沒有其他人的答案,迭代像你是通過一個數組來搜索一個非常糟糕的方式。 PHP具有內置的功能只是爲:

http://fr.php.net/array_search

所以,你可能想給一個嘗試,看看它是否與您的問題有所幫助。還要確保你寫的PHP文件也是用UTF-8編碼的!

UPDATE:

嘗試下面的代碼,它工作得很好我的服務器上。如果不起作用,請檢查PHP是否配置爲默認使用UTF-8,或添加必要的ini_set調用。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> 
<html> 
<head><title>norvegian utf-8 test</title> 
<meta http-equiv="Content-type" value="text/html; charset=UTF-8" /> 
</head> 

<body> 

<?php 

function isSpecial($char) { 
    $special_chars = array("æ", "ø", "å", "か"); 
    return (array_search($char, $special_chars) !== false); 
} 

if (isset($_REQUEST["char"])) { 
    echo $_REQUEST["char"].(isSpecial($_REQUEST["char"])?" (true)":" (false)"); 
} 


?> 

<form method="POST" accept-charset="UTF-8"> 
<input type="text" name="char"> 
<input type="submit" value="submit"> 
</form> 


</body> 
</html> 
+0

感謝您的回答。我確實使用了數組搜索,但沒有看到數組與the UTF-8ø是一樣的,所以我創建了自己的循環來測試不同的編碼和內容。 PHP文件使用UTF-8格式。 – Christoffer 2008-10-03 12:49:42

0

看看你是否有mbstring擴展安裝

3

如果你的PHP腳本文件有一個ANSI編碼,而不是UTF-8,然後在字節級的挪威人物將是什麼,他們會不同如果他們是用UTF-8編碼的話。由於PHP是一種字節處理語言,而不是文本處理語言,因此它適時比較字節序列並得出它們不匹配的結論。

要解決這個問題,您可以確保您的PHP腳本與您要比較的字符集具有相同的編碼,也可以使用iconv或mbstring庫轉換爲適當的字符集。

另外,如果你沒有看過它,閱讀:http://www.joelonsoftware.com/articles/Unicode.html

更新:
你考慮的另一點是,確保你正在傳遞到這個功能是你在想什麼它是。如果您使用數組索引操作符一次一個字符地循環一個字符串,它將不起作用,因爲您的UTF-8字符串可能使用兩個字節(兩個數組索引位置)來存儲一個字符。在mbstring中有函數根據字符位置而不是字節位置從字符串中複製文本。

0

嘗試使用utf8編碼和解碼功能。可能有幫助

1

我終於明白了。這可能不是一個很好的方法,但它的工作原理。

看來我正在使用的數組與輸入字符的字符集不同。我通過創建一個包含所有數組元素的字符串來解決這個問題,然後使用mb_strpos來搜索字符。所以對代碼唯一的改變是isNorwegianChar函數。新功能如下所示:

function isNorwegianChar($Char) 
{ 
    $sNorwegianChars = "'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZæÆøØåÅ=() -,"; 

    if(mb_strpos($sNorwegianChars, $Char)) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

感謝您的幫助!

0

由於問題是將Norvegian單詞與中文單詞分開,爲什麼不使用明確的字形來實現(我個人比較喜歡「¶」),而不是依賴算法?

impulsiv¶形衝動的

然後使用mb-split,或與mb-substr組合mb-strpos

如果您需要輸出字符串,您可以輕鬆地將其替換爲空格!

不幸的是,PHP中的PCRE不允許我們使用\ p和script names

(在regexp.reference尋找 「InMusicalSymbols」,在§ 「Unicode字符屬性」,要明白我的意思)