2008-10-03 4 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; 

} 

Если у кого-либо есть представление о том, что я могу сделать, прошу сообщить мне.

Update:

Причина необходимости в том, что я пытаюсь разобрать текстовый файл, содержащие строки с норвежскими и китайскими словами, как словарь. Я хочу разделить строку на строки, одну из которых содержит норвежское слово, а другое - на китайском. Это позже будет вставлено в базу данных. Пример строки:

IMPULSIV 形 衝動 的

imøtegå 動 反對, 反駁

imøtekomme 動 符合

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

alkoholpåvirket形 受 酒精 影響 的

алкотест 名 呼吸 性 酒精 酒精

alkymi (ул) 名 煉金術 (名 煉金術 士)

все, альт, алле, 形 全部, 所有

Как вы можете видеть, что может быть пробелы между словами, так что я не могу использовать что-то легко разрывается, чтобы разделиться между китайскими и норвежскими словами. Я использую isNorwegianChar и цикл через строку, пока не найду символ, который не находится в массиве.

Проблема в том, что она не возвращается как норвежский персонаж, и она думает, что китайское слово началось.

Вот код:

//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

Спасибо за ответ. Я использовал поиск массива, но он не видел, что массив ø был таким же, как 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

Update:
еще один момент принять во внимание, чтобы убедиться, что вы передаете в этой функции является то, что вы думаете это. Если вы перебираете строку по одному символу за раз с помощью оператора индексирования массива, это не сработает, потому что ваша строка 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

Поскольку проблема заключается в том, чтобы отделять норвежские слова от китайских, почему бы вам не использовать явный глиф, чтобы сделать это (например, как «¶»), вместо того, чтобы полагаться на алгоритм?

impulsiv¶ 形 衝動 的

Затем с помощью mb-split или mb-substr в сочетании с mb-strpos.

Вы можете легко заменить его пространством, если вам нужно вывести строку!

К сожалению, PCRE в PHP не позволяет нам использовать \ p с script names.

(искать "InMusicalSymbols" в regexp.reference, в § "свойств символов Unicode", чтобы понять, что я имею в виду)

Смежные вопросы