2014-11-23 8 views
5

Ich bin gespannt, wie strlen Unicode-Zeichen aus mehreren Bytes in C zählenwie funktioniert Strlen Zahl Unicode in c

Ist es jedes Byte oder Zeichen zählen, bis der erste (wie sie aus mehreren Bytes bestehen kann) ' \ 0 '?

+0

strlen arbeitet mit Bytes. und einige Unicode-Zeichen haben '0x00' als erstes Byte, also 1) strlen ist unbrauchbar für Unicode-Strings. 2) Es gibt verfügbare Funktionen für die Arbeit mit Multibyte-Zeichen: Sie könnten eine der Wide-Char Funktionen wie _mbstrnlen() oder wcsnlen verwenden, die in string.h und wchar.h oder mbstring.h – user3629249

Antwort

6

strlen() zählt die Anzahl der Bytes, bis ein \0 auftritt. Dies gilt für alle Zeichenfolgen.

Für Unicode beachten Sie, dass der Rückgabewert strlen() durch das möglicherweise vorhandene \0 Byte in einem anderen gültigen Zeichen als dem Nullabschlusszeichen beeinflusst werden kann. Wenn UTF-8 verwendet wird, ist es in Ordnung, da kein anderes gültiges Zeichen als ASCII 0 ein \0 Byte haben kann, aber es ist möglicherweise nicht wahr für andere Kodierungen.

+0

definiert sind Sind Sie sicher dort können Konflikte in Unicode Strings mit dem \ 0 Zeichen sein? Wird eine neue und verwandte Frage stellen! –

+4

Es hängt vom Code ab. Wenn Sie UTF-16 verwenden, besteht ein Zeichen wie U + 00FF (ÿ) aus einem Nullbyte und einem 0xFF-Byte (in der einen oder anderen Reihenfolge, je nach Endianess: UTF-16LE oder UTF-16BE) , und das Nullbyte stoppt 'strlen()' in seinen Spuren. Bei UTF-32 tritt das Problem bei jedem Unicode-Zeichen auf, da der Maximalwert U + 10FFFF ist, was bedeutet, dass in jedem möglichen 4-Byte-Unicode-Wert mindestens ein Null-Byte enthalten ist. UTF-8 vermeidet dieses Problem sorgfältig; Die einzige Zeit, in der ein Nullbyte angezeigt wird, ist, wenn das Zeichen U + 0000 ist. –

2

strlen gilt nur für Strings, das heißt null terminierte Arrays von char. Alle Multibyte-Codierungen, die in Strings zulässig sind, haben die Eigenschaft, dass sie keine internen Nullbytes enthalten, daher funktionieren strlen und andere str-Funktionen wie strcat einwandfrei.

Wenn Sie mit "Unicode" Arrays von wchar_t dann bedeuten, kann dies Nullbytes enthalten, aber auch hier ist dies kein Problem, keines der wchar_t Elemente selbst wird null sein. Und Sie sollten die str Funktionen nicht auf solche Arrays anwenden, sie sind nicht für sie definiert.