2016-04-12 5 views
1

Ich lese diese auf this blogKann ein Zeichen mehrere Runen in Go umfassen?

Selbst mit Rune Scheiben ein einzelnes Zeichen möglicherweise mehrere Runen erstrecken, die, wenn Sie Zeichen mit Gravis haben, zum Beispiel passieren kann. Diese komplizierte und mehrdeutige Art von "Zeichen" ist der Grund, warum Go-Zeichenfolgen als Bytefolgen dargestellt werden.

Ist es wahr? (Es scheint wie ein Blog von jemandem, der Go kennt). Ich habe an meiner Maschine getestet und "è" ist 1 Rune und 2 Bytes. Und die Go doc scheint anders zu sagen.

Sind Sie auf solche Charaktere gestoßen? (utf-8) Kann ein Charakter mehrere Runen in Go umfassen?

Antwort

2

Ja, es kann:

s := "é́́" 
fmt.Println(s, []rune(s)) 

Output (versuchen Sie es auf dem Go Playground):

é́́ [101 769 769 769] 

Ein Zeichen, 4 Runen. Es kann beliebig lang sein ...

Beispiel entnommen aus The Go Blog: Text Normalization in Go.

Was ist ein Zeichen?

Wie in den Strings Blogpost erwähnt, können Zeichen mehrere Runen umfassen. Zum Beispiel können ein "e" und "◌" (akut "\ u0301") kombinieren, um "é" ("e \ u0301" in NFD) zu bilden. Zusammen sind diese beiden Runen ein Charakter. Die Definition eines Zeichens kann abhängig von der Anwendung variieren. Zur Normalisierung werden wir es als eine Folge von Runen definieren, die mit einem Starter beginnen, einer Rune, die sich nicht mit irgendeiner anderen Rune verändert oder kombiniert, gefolgt von einer möglicherweise leeren Folge von Nichtstartern, dh Runen, die dies tun (typischerweise Akzente)). Der Normalisierungsalgorithmus verarbeitet ein Zeichen zur gleichen Zeit.

Ein Charakter kann durch eine beliebige Anzahl von modifiers folgen (Modifikatoren können wiederholt und gestapelt werden):

Theoretisch

, gibt auf die Anzahl der runes nicht gebunden ist, das ein Unicode-Zeichen bilden kann. Tatsächlich gibt es keine Beschränkungen für die Anzahl der Modifikatoren, die einem Zeichen folgen können, und ein Modifikator kann wiederholt oder gestapelt werden. Schon mal ein 'e' mit drei acutes gesehen? Hier gehts: "é". Das ist ein vollkommen gültiger 4-Runen-Charakter nach dem Standard.

Siehe auch: Combining character.

Bearbeiten:"Tötet das nicht das Konzept der Runen?"

Antwort: Es ist kein Konzept von Runen. A rune ist kein Zeichen. Eine Rune ist ein ganzzahliger Wert, der einen Unicode-Codepunkt identifiziert. Ein Zeichen kann ein Unicode-Codepunkt sein. In diesem Fall ist 1 Zeichen 1 rune. Ein Großteil der allgemeinen Verwendung von rune s passt in diesen Fall, so dass dies in der Praxis kaum Kopfschmerzen bereitet.Es ist ein Konzept der Unicode standard.

+0

Danke. Aber tötet es nicht das Konzept der Runen? Wenn du über die Runen von 'é' iterierst, gibt Go 4 Runen zurück? Denn 'é' (mit einem Akzent) macht durchaus Sinn, nur 1 Rune zu haben, nicht 2. – Thomas

+0

@Thomas Es ist kein Konzept von 'rune's. Bitte sehen Sie die bearbeitete Antwort. – icza

+0

Danke ich glaube ich verstehe jetzt – Thomas