2012-02-27 10 views
6

Sto provando a scrivere codice per confrontare due stringhe. In Windows posso usare strcmp ma voglio scrivere per la stringa di caratteri multibyte in modo che sia compatibile con tutte le altre piattaforme Posso usare memcmp? se no allora c'è qualche altra API che posso usare o ho bisogno di scrivere la mia API.Posso usare memcmp due confrontare la stringa di caratteri multibyte?

+3

Dipende se le due stringhe utilizzano la stessa codifica. –

risposta

1

Se le stringhe utilizzano entrambe la stessa codifica, memcmp funzionerà correttamente. Tieni presente che i caratteri ampi sono di dimensioni diverse su piattaforme diverse, tuttavia.

Se le stringhe utilizzano codifiche diverse, è necessario disporre di una libreria come ICU per gestirle.

2

Se le due stringhe utilizzano la stessa codifica, è possibile utilizzare memcmp. Se utilizzano UTF-8, è possibile utilizzare anche strcmp, poiché 0 non viene visualizzato nelle stringhe con codifica UTF-8. Un'altra opzione è convertire le stringhe in caratteri ampi usando mbstowcs.

+0

Questo avrà falsi negativi - due stringhe identiche possono essere codificate in diversi modelli di byte. Devi confrontarti con una funzione savvy Unicode. – StilesCrisis

+0

@StilesCrisis: puoi fornire un esempio di come le stringhe identiche possono avere codifiche UTF-8 diverse? O, del resto, come ciò potrebbe accadere con qualsiasi altra codifica di signle (come ISO 8859-1)? Ho fatto capire che le stringhe dovevano usare la stessa codifica. –

+0

@Ted Hopp: Con UTF-8, è possibile codificare un carattere in forma troppo lunga (una sequenza che decodifica su un valore che dovrebbe utilizzare una sequenza più breve: questa frase proviene da wikipedia). In questo caso, memcmp restituisce una risposta errata, ma la funzione di confronto consapevole UTF-8 restituisce la risposta corretta ... – Malkocoglu

5

Devi stare attento. Non sono un esperto di codifiche Unicode/multi byte, ma so che con i segni diacritici a volte due stringhe possono essere considerate uguali quando i loro byte non sono esattamente gli stessi. Si consiglia di utilizzare API pre-testate, poiché le codifiche delle stringhe possono diventare piuttosto confuse.

Vedere the old new thing on case mapping. Non riesco a pensare a un riferimento per i segni diacritici, ma se lo faccio lo posterò.

+0

Questo è corretto. Per alcuni casi, un 'memcmp' funzionerà. Per correttezza al 100%, e specialmente se è coinvolto Unicode in qualsiasi forma, 'memcmp' non funzionerà. Anche i caratteri semplici come 'é' possono essere rappresentati più di un modo: o come' é' (un carattere Unicode), o come ''' combinato con' e' (in due caratteri Unicode). La maggior parte delle volte, queste non vengono mixate e abbinate, quindi all'inizio potresti non notare alcun problema, ma alla fine ti morderà. – StilesCrisis

+0

Un altro modo in cui le stringhe possono essere "considerate" uguali, ma non uguali ai byte è se il confronto è invariante rispetto al caso. In questo caso è necessario eseguire ciò che viene chiamato caso folding, che consente il confronto di maiuscole, minuscole, didascalie e glifo invarianti (che, come detto sopra, potrebbero essere rappresentati in memoria come punti multipli di codice ... o no). – Bingo

+0

Uguale dopo la normalizzazione non è la stessa cosa uguale. Questo è il punto centrale della normalizzazione. OP stava chiedendo se due stringhe di stringhe sono uguali, non se sono equivalenti. –