Cosa succede veramente quando cambiamo la codifica in una stringa?

2

link

Dì che faccio:

$encoded = mb_convert_encoding ($original);

Sembra abbastanza semplice. Quello che sto immaginando è il seguente

$original ha un puntatore al modo in cui la stringa è effettivamente codificata. Qualcosa come char * tipo di cosa. E poi ci sono cose come quello che il personaggio ha effettivamente codificato.

Probabilmente è da qualche parte lungo il genere di UTF-64 in cui ogni glifo è effettivamente un personaggio.

Ora quando lo facciamo

$encoded = mb_convert_encoding ($original); 

possono succedere diverse cose:

  • la rappresentazione interna originale non cambia ma viene REINTERPRETATA in modo che il codice visualizzato sia diverso
  • la stringa originale che rappresenta non cambia tuttavia la modifica ENCODING.

Quale è giusto?

    
posta user4951 01.06.2012 - 07:53
fonte

2 risposte

2

Una stringa non è un sacco di byte e una specifica della codifica: nella maggior parte delle lingue una stringa è un sacco di byte e nei casi migliori una codifica implicita definita dalla lingua. È tua responsabilità come programmatore sapere cosa fare a seconda della codifica (modifica: come indicato da thammer, la maggior parte del linguaggio moderno proibisce esplicitamente di manipolare le stringhe in altre codifiche oltre a quella implicitamente definita).

Quando si utilizza una funzione di codifica, non si imposta una menzione da qualche parte che la stringa utilizza una codifica diversa, si cambiano i byte (la rappresentazione interna) in modo che sia corretta per quanto riguarda la codifica prevista. Ma devi tenere traccia della codifica utilizzata.

Ad esempio, se cambi la codifica di una stringa in UTF-16, strlen ti darà un risultato errato (almeno se ti aspetti che sia il numero di caratteri) perché conterà i byte. Devi utilizzare mb-strlen e precedere la codifica.

    
risposta data 01.06.2012 - 10:28
fonte
1

Il problema è che PHP considera le stringhe come sacchetti-di-byte, senza fare alcuna distinzione tra i bytestrings e le stringhe 'appropriate', e non traccia la codifica di questi ultimi.

Una codifica è, in pratica, una mappatura di sequenze di byte a codepoint appropriati. Quindi, ciò che mb_convert_encoding fa è dividere la stringa data in sequenze di byte appropriate in base alla codifica di input, tradurle in punti di codice e quindi ritornare in sequenze di byte basate sulla codifica di destinazione.

Poiché molte codifiche non definiscono tutti i punti di codice, e alcune codifiche possono considerare certe sequenze di byte come non valide (ad es. ASCII non consente nulla sopra 127), è possibile specificare cosa deve fare PHP quando incontra una situazione del genere. / p>

Si noti che mb_convert_encoding ha due parametri che specificano le codifiche di input e di output ( to e from ); se non si specifica from_encoding , viene utilizzata la codifica interna attualmente impostata. Devi sempre impostare la codifica interna su UTF-8, a meno che tu non abbia motivi convincenti per non farlo.

    
risposta data 01.06.2012 - 12:48
fonte

Leggi altre domande sui tag