Finden Sie nicht-ascii-Zeichen aus einem UTF-8 string
Ich muss die nicht-ASCII-Zeichen aus einer UTF-8-string.
mein Verständnis:
UTF-8 ist eine Obermenge der Zeichen-Codierung, in denen 0-127 ascii-Zeichen.
Also, wenn in einem UTF-8-string , ein-Zeichen-Wert Nicht zwischen 0 und 127, dann ist es kein ascii-Zeichen , richtig? Bitte korrigieren Sie mich wenn ich bin falsch hier.
Auf dem oben genannten Verständnis ich geschrieben habe folgenden code in C :
Hinweis:
Ich bin mit der Ubuntu-gcc-compiler, um zu laufen C code
utf-string ist x√ab c
long i;
char arr[] = "x√ab c";
printf("length : %lu \n", sizeof(arr));
for(i=0; i<sizeof(arr); i++){
char ch = arr[i];
if (isascii(ch))
printf("Ascii character %c\n", ch);
else
printf("Not ascii character %c\n", ch);
}
Dem Drucke der Ausgabe:
length : 9
Ascii character x
Not ascii character
Not ascii character �
Not ascii character �
Ascii character a
Ascii character b
Ascii character
Ascii character c
Ascii character
Bloßem Auge in der Länge von x√ab c zu sein scheint 6, aber im code ist es und kommt als 9 ?
Richtige Antwort für die x√ab c ist 1 ...ich.e hat es nur 1 nicht-ascii-Zeichen , aber in der obigen Ausgabe ist es, sich so 3 (mal Nicht ascii-Zeichen).
Wie finde ich die nicht-ascii-Zeichen aus UTF-8-string, richtig.
Bitte guide zu dem Thema.
- der Schlüssel, um den Unterschied (und viele der alten können wir nicht mehr bewegen) ist, dass, wenn dies ist ein pre-code-Frage (du bist auf dem whiteboard oder in einem Konferenzraum Gedanken über den code), dann seine wahrscheinlich eher eine Frage für P. SE. Wenn Sie vorhandenen code und Debuggen, es ist eher SO.
wchar
- und Unicode-Suche, auf google- √ (square root symbol) hat den unicode-Wert des 221A und ist in UTF-8 codiert als
e2 88 9a
finden Sie unter fileformat.info/info/unicode/char/221A/index.htm - danke. das nächste mal werde ich daran erinnern, dass
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was C ruft eine
char
ist eigentlich ein byte. Eine UTF-8-Zeichen kann aus mehreren bytes.In der Tat nur das ASCII-Zeichen dargestellt werden, die durch ein einzelnes byte in UTF-8 (das ist, warum alle gültigen ASCII-kodierter text ist auch effektiv UTF-8-kodiert).
So, dass die Anzahl der UTF-8-Zeichen, die Sie zu tun haben, eine teilweise Entschlüsselung: die Anzahl der UTF-8 start codepoints.
Sehen der Wikipedia-Artikel zu UTF-8 finden Sie heraus, wie Sie codiert werden.
Grundsätzlich gibt es 3 Kategorien:
Zählen die Anzahl der unicode-codepoint einfach zählen alle Zeichen, die nicht Fortsetzung bytes.
Jedoch unicode-Codepoint nicht immer eine 1-zu-1-Korrespondenz zu "Zeichen" (abhängig von Ihrer genauen definition des Charakters).
Den UTF-8-Zeichen, wenn Sie in ein Zeichen-array nimmt es in der Weise, dass das erste byte belegt durch jedes UTF-8 Zeichen enthalten würde, die Informationen in Bezug auf die Anzahl der bytes, die zur Darstellung der Zeichen. Die Anzahl der aufeinander folgenden 1 aus dem MSB des ersten Bytes repräsentieren die Gesamt-bytes, die durch die nicht-ascii-Zeichen. Im Fall von '√' die binäre form wäre: 11100010,10001000,10011010. Zählen der Anzahl von 1 ' s in der das erste byte gibt die Anzahl der bytes belegt, wie die 3. So etwas wie der code unten funktionieren würde, für das: