2016-08-02 31 views
5

Gibt es eine Möglichkeit, die Mindestanzahl an Bytes, die ein Zeichen in einer bestimmten Codierung benötigt, sicher zu bestimmen? Wie eine der von der mbstring-Erweiterung unterstützten Codierungen. Der Wert ist 1 für UTF-8, 2 für UTF-16 usw.Wie kann man die Mindestanzahl von Bytes bestimmen, die ein Zeichen benötigt?

Ich möchte nicht die Länge einer bestimmten Zeichenfolge oder eines Zeichens erhalten.

Ich möchte die minimale Zeichengröße wissen, die von einer gegebenen Kodierung unterstützt wird, entsprechend ihrer Spezifikation.

Ich verwende derzeit diesen Code:

<?php 

function flawed_detection($encoding) 
{ 
    // I use 'a' in the hope that this char need the least number of bytes in all the supported encodings 
    return strlen(mb_convert_encoding('a', $encoding, 'UTF-8')); 
} 

foreach (mb_list_encodings() as $encoding) { 
    echo "$encoding: ", flawed_detection($encoding), "\n"; 
} 

Teilausgang:

... 
UTF-16LE: 2 
UTF-8: 1 
UTF-7: 1 
UTF7-IMAP: 1 
ASCII: 1 
EUC-JP: 1 
... 

Aber ich bin nicht sicher, ob das "richtige" Zeichen zu verwenden. Wenn es jemals einen gibt.

edit: Ich habe den Brute-Force-Ansatz mit allen Zeichen von 0 bis U + 10FFFF in allen Kodierungen getestet, und die Ergebnisse sind genau die gleichen wie mit meiner finally_not_so_flawed_detection-Funktion (mit dem 'a' char oder mit space): p

+1

Mögliches Duplikat von [Größe der Zeichenfolge in Bytes in PHP] (http://stackoverflow.com/questions/7568949/measure-string-size-in-bytes-in-php) –

+0

Warum? Was ist das Ziel hier? Haben Sie einen geschäftlichen oder technischen Grund, UTF-8 nicht auf der ganzen Linie zu verwenden? –

+0

Was warum? Dies ist eine allgemeine Frage: p Und ich verwende UTF-8 in meinem Projekt, aber ich muss einige Zeichenfolgen in Binärdateien dekodieren. – Ayell

Antwort

1

Ich bin mir nicht bewusst, wie Sie sicher sagen können, aber eine vernünftige Annäherung wird die Breite des Leerzeichen (" ", U + 20, etc.) überprüfen. Soweit ich weiß, unterstützt jede vernünftige Textkodierung dieses Zeichen, und jede Kodierung mit variabler Länge verwendet eine Sequenz minimaler Länge dafür.

+0

'a' und '' geben die exakt gleichen Ergebnisse :) – Ayell