PHP utf8 sorunu

7 Cevap php

Ben bir utf8 karakter ile Norveç karakterleri ile bir dizi karşılaştırarak bazı sorunlar var.

Özel Norveç karakterler (Æ, Ø å) hariç tüm karakterler çalışıyor.

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;

}

Herkes pleas bana bildirin ne yapabileceğiniz hakkında herhangi bir fikir varsa.

Update:

Bu ihtiyacı için neden bir sözlük gibi Norveç ve Çin kelimelerle satırları içeren bir metin dosyasını ayrıştırmak çalışıyorum olmasıdır. Ben dizeleri için çizgi, Norveç sözcüğü ve Çince içeren birini içeren bir bölmek istiyorum. Bu daha sonra bir veritabanına eklenecektir. Örnek hatları:

impulsif 形 冲动 的

imøtegå 动 反对, 反驳

imøtekomme 动 符合

alkoholmisbruk (er) 名 滥用 酒精 (名 滥用 酒精 的 人)

alkoholpåvirket 形 受 酒精 影响 的

alkotest 名 呼吸 性 酒精 测试

alkymi (st) 名 炼金术 (名 炼金术 士)

tüm alt, alle, 形 全部, 所有

Eğer kelimeler arasında boşluk olabileceğini görebileceğiniz gibi ben gibi Çin ve Norveç kelimeler arasında bölünmüş patlayabilir kolay bir şey kullanamazsınız. Ne yapmam ben dizide olmayan bir karakter bulana kadar hattı üzerinden isNorwegianChar ve döngü kullanmaktır.

Sorun æ, ø ve å Norveçli bir karakter olarak iade edilmez ve Çince kelime başladığını düşünüyorum.

İşte kod:

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

7 Cevap

PHP komut dosyası yerine UTF-8 ANSI kodlama, varsa, o byte düzeyinde olanlar Norveçli karakterler UTF-8 olarak kodlanmış olsaydı onlar ne olurdu farklı olacaktır. PHP bir bayt işleme dili değil, bir metin işleme dili olduğu için, usulüne uygun bayt dizileri karşılaştırır ve onlar eşleşmiyor varmıştır.

Bu sorunu çözmek için, sizin PHP script karşı karşılaştırarak konum karakter kümesi olarak aynı kodlama vardır emin olabilirsiniz, ya sen uygun karakter setleri dönüştürmek için iconv veya Mbstring kütüphaneleri kullanabilirsiniz.

Eğer okumadıysanız eğer Ayrıca, bu okuyun: http://www.joelonsoftware.com/articles/Unicode.html

Update: dikkate almak başka ne anlamı var bu fonksiyonun içine geçiyoruz bunu düşünüyorum ne olduğundan emin olmaktır
. Eğer dizi indeksleme operatörü ile bir defada bir dize bir karakter karşısında loop yapıyorsanız sizin UTF-8 dizesi bir karakteri saklamak için iki byte (iki dizi dizin konumları) kullanabilir, çünkü çalışmaz. Karakter pozisyonları değil, bayt pozisyonları dayalı dizeleri metin üzerinden kopyalamak için Mbstring işlevleri vardır.

Kimse cevaplar, ilerlerken bir dizi arama için çok kötü bir yoldur olup isterseniz şeyden önce ve daha sonra UTF-8 için alırsınız. PHP yerleşik işlevleri sadece bunun için:

http://fr.php.net/array_search

Yani bu bir deneyin ve sizin sorunu ile yardımcı olmadığını görmek isteyebilirsiniz. Ayrıca yazıyoruz PHP dosyası da UTF-8 olarak kodlanmış olduğundan emin olun!

UPDATE:

Benim sunucuda sadece çalışıyor aşağıdaki kodu deneyin. İşe yaramazsa PHP varsayılan olarak UTF-8 ile çalışmak üzere yapılandırılmış olduğunu kontrol edin, ya da gerekli ini_set çağrıları eklemek.

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

Sonunda anladım. Bunu yapmak için güzel bir yol olmayabilir, ama çalışır.

Beraber çalıştığım dizi giriş karakteri farklı bir charset gibi görünüyor. Ben tüm dizi öğelerinin dize yaparak bu sorunu çözdük ve ardından karakterleri aramak için mb_strpos kullanın. Yani kod tek değişiklik isNorwegianChar fonksiyonudur. Yeni işlev, bu gibi görünüyor:

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

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

Tüm yardım için teşekkürler!

Eğer uzatma yüklü Mbstring varsa görün

Ben biliyorum ne, en iyi bahis web sunucusu erişiminiz varsa mbstring'i (http://www.php.net/manual/en/ref.mbstring.php) ekstansiyon yüklemektir.

Utf8 kodlama ve çözme için fonksiyonları kullanmayı deneyin. yardımcı olabilir

Sorun (I "¶" gibi personnaly) bunu açık bir glif kullanmayın neden yerine bir algoritma güvenmek, Çinli olanlardan Norvegian kelime (ler) ayırmak için olduğu gibi?

impulsif ¶ 形 冲动 的

Daha sonra mb-split kullanarak, ya da mb-substr mb-strpos ile birlikte.

Eğer çıkış dize gerekirse kolayca boşluk ile değiştirebilirsiniz!

Ne yazık ki, PHP PCRE bize script names ile \ p kullanmak için izin vermez.

(Ne demek istediğimi anlamak için, § "Unicode karakter özelliklerine" in, regexp.reference in "InMusicalSymbols" için bakın)