Aynı byte uzunluğuna iki dizge dönüştürme

2 Cevap php

I have 2 strings in my PHP code, 1 is a parameter to my method and 1 is a string from an ini file. The problem is that they are not equal, although they have the same content, probably due to encoding issues. When using var_dump, it is reported that the first string's lenght is 23 and the second string's length is 47 (see the end of my question for the reason behind this)

Nasıl ikisi de aynı şekilde kodlanmış olduğundan emin olun ve karşılaştırma başarısız olmaz böylece sonunda aynı uzunluğa sahip olabilir? Tercihen, ben onları utf8 kodlanmış olmak istiyorum.

Referans için, bu kodu bir alıntıdır:

static function getString($keyword,$file) {

$lang_handle = parse_ini_file($file, true);

var_dump($keyword);
    foreach ($lang_handle as $key => $value) {
        var_dump($key);
        if ($key == $keyword) {
            foreach ($value as $subkey => $subvalue) {
                var_dump("\t" . $subkey . " => " . $subvalue);
            }
        }
    }
}

Aşağıdaki INI ile:

[clientcockpit/login.php]
header = "Kunden Login"
username = "Benutzername"
password = "Passwort"
forgot = "Passwort vergessen"
login = "Login"

GetString ile yöntemi ("clientcockpit / login.php", "inifile.ini") ararken çıktı:

string 'clientcockpit/login.php' (length=23)
string '�c�l�i�e�n�t�c�o�c�k�p�i�t�/�l�o�g�i�n�.�p�h�p�' (length=47)

2 Cevap

INI dosyası, tek bir karakteri temsil etmek için iki bayt kullanarak, UTF16 kodlama veya benzeri gibi görünüyor. Ben senin dize garip karakterler aslında null bayt olduğunu tahmin (\0).

PHP'nin Unicode desteği oldukça zayıf ve ben parse_ini_file() düzgün Çokbaytlı kodlamaları desteklemiyor sanırım. Bu bir "ASCII uyumlu" tek bayt kodlama kullanılarak kodlanmış sanki sadece özel karakterler arıyor, dosyayı tedavi edecek [ ve ] bölümleri tespit etmek. Bunun bir sonucu olarak, bu bölüm anahtarlar bozuk olacaktır: Bir bayt aslında [ ya da ] bölümünde anahtarının bir parçası olacak ait:

UTF-16:    [c]    (3 characters, 6 bytes)

For UTF-16BE (big endian):

  Bytes:    00 5B    00 63    00 5D    (6 bytes)
  ASCII:    \0  [    \0  c    \0  ]    (6 characters)

For UTF-16LE (little endian):

  Bytes:    5B 00    63 00    5D 00    (6 bytes)
  ASCII:    [  \0    c  \0    ]  \0    (6 characters)

Yerine kaynak dosya kodlama UTF-16 ise c, parse_ini_file() \0c\0 okuyacak okuma, ASCII varsayarsak.

INI dosyası biçimini kontrol edebilirsiniz eğer, favori metin editörü kullanarak, UTF8 veya ISO-8859-1 kodlama kaydetmek için emin olun.

Aksi takdirde, file_get_contents() kullanarak dosya içeriğini okumak (iconv() kullanarak örneğin) kodlama dönüşümünü yapmak ve parse_ini_string() için sonuç geçmek zorunda olacaktır. Burada dezavantajı orijinal dosya kodlamasını algılamak veya kodlamalısınız olmasıdır.

mb Çokbaytlı uzantısı PHP kurulumu mevcut ise, mb_detect_encoding() kullanabilir ve mb_convert_encoding() dinamik dönüşüm yapmak.

Bu deneyin:

$lang_handle = parse_ini_string(file_get_contents($file), true);