Ich habe mich in letzter Zeit mit der UTF-8-Unterstützung von Go beschäftigt und war neugierig, wie gut es nicht-lateinische Skripte im Code verarbeitet.
Los und UTF-8
Go-Quelldateien sind standardmäßig UTF-8-kodiert. Das bedeutet, dass Sie theoretisch Unicode-Zeichen in Ihren Variablennamen, Funktionsnamen und mehr verwenden können.
Zum Beispiel könnten Sie im offiziellen Go-Playground-Codebeispiel auf Code wie diesen stoßen:
package main import "fmt" func main() { 消息 := "Hello, World!" fmt.Println(消息) }
Hier ist 消息 Chinesisch für „Nachricht“. Go meistert dies dank der Unicode-Unterstützung problemlos. Diese Fähigkeit ist einer der Gründe, warum Go in Ländern wie China und Japan an Popularität gewonnen hat – Entwickler können Code mit Bezeichnern schreiben, die in ihrer eigenen Sprache aussagekräftig sind. Sie werden es nicht glauben, aber es ist in China sehr beliebt, Code in ihrer Muttersprache zu schreiben, und ich liebe es.
Versuch, tamilische Identifikatoren zu verwenden
Natürlich wollte ich das mit Tamil, meiner Muttersprache, ausprobieren.
Hier ist ein einfaches Beispiel, das ich geschrieben habe:
package main import "fmt" func main() { எண்ணிக்கை := 42 // "எண்ணிக்கை" means "number" fmt.Println("Value:", எண்ணிக்கை) }
Auf den ersten Blick scheint dies unkompliziert zu sein und kann fehlerfrei ausgeführt werden.
Aber als ich versuchte, den Code zu kompilieren, stieß ich auf Fehler
./prog.go:6:11: invalid character U+0BCD '்' in identifier ./prog.go:6:17: invalid character U+0BBF 'ி' in identifier ./prog.go:6:23: invalid character U+0BCD '்' in identifier ./prog.go:6:29: invalid character U+0BC8 'ை' in identifier ./prog.go:7:33: invalid character U+0BCD '்' in identifier ./prog.go:7:39: invalid character U+0BBF 'ி' in identifier ./prog.go:7:45: invalid character U+0BCD '்' in identifier ./prog.go:7:51: invalid character U+0BC8 'ை' in identifier
Das Problem mit der tamilischen Kombination von Zeichen verstehen
Um zu verstehen, was vor sich geht, ist es wichtig, ein wenig über die Funktionsweise der tamilischen Schrift zu wissen.
Tamil ist ein Abugida – ein Schriftsystem, bei dem jede Konsonant-Vokal-Sequenz als Einheit geschrieben wird. In Unicode beinhaltet dies häufig die Kombination eines Basiskonsonantenzeichens mit einem oder mehreren Kombinationszeichen, die Vokale oder andere Modifikatoren darstellen.
Zum Beispiel:
Der tamilische Buchstabe க (U 0B95) repräsentiert den Konsonantenlaut „ka“
Um „ki“ darzustellen, würden Sie க mit dem Vokalzeichen ி (U 0BBF) kombinieren, was zu கி.
Das Vokalzeichen ி ist ein Kombinationszeichen, das in Unicode speziell als „Non-Spacing Mark“ klassifiziert wird.
Hier entsteht das Problem.
Die Sprachspezifikation von Go erlaubt Unicode-Buchstaben in Bezeichnern, schließt jedoch Kombinationszeichen aus. Insbesondere können Bezeichner Zeichen umfassen, die als „Buchstaben“ (Kategorien Lu, Ll, Lt, Lm, Lo oder Nl) und Ziffern klassifiziert sind, jedoch keine Kombinationszeichen (Kategorien Mn, Mc, Me).
Beispiele für die Kombination von Zeichen auf Tamil
Sehen wir uns an, wie tamilische Schriftzeichen gebildet werden:
Eigenständiger Konsonant: க (U 0B95) – Erlaubt in Go-Bezeichnern.
Konsonantenvokalzeichen: கா (U 0B95 U 0BBE) – Nicht zulässig, da ா (U 0BBE) ein Kombinationszeichen (Mc) ist.
Konsonantenvokalzeichen: கி (U 0B95 U 0BBF) – Nicht zulässig, da ி (U 0BBF) ein Kombinationszeichen (Mn) ist.
Konsonantenvokalzeichen: கூ (U 0B95 U 0BC2) – Nicht zulässig, da ூ (U 0BC2) ein Kombinationszeichen (Mc) ist.
Im Bezeichner எண்ணிக்கை („Zahl“) enthalten die Zeichen Kombinationszeichen:
எ (U 0B8E) – Buchstabe, erlaubt.
ண் (U 0BA3 U 0BCD) – Gebildet aus ண (U 0BA3) und dem virama ் (U 0BCD), einem verbindenden Zeichen (Mn).
ண (U 0BA3) – Buchstabe, erlaubt.
ிக்கை – Enthält Kombinationszeichen wie ி (U 0BBF) und ை (U 0BC8).
Da diese Kombinationszeichen in Go-Bezeichnern nicht zulässig sind, gibt der Compiler Fehler aus, wenn er auf sie stößt.
Warum chinesische Schriftzeichen funktionieren, Tamil jedoch nicht
Chinesische Zeichen werden in Unicode im Allgemeinen in die Kategorie „Buchstabe, Andere“ (Lo) eingeordnet. Es handelt sich um eigenständige Symbole, die keine Kombinationszeichen erfordern, um vollständige Zeichen zu bilden. Aus diesem Grund funktionieren Bezeichner wie 消息 in Go perfekt.
Praktische Implikationen
Die Unfähigkeit, Kombinationszeichen in Bezeichnern zu verwenden, hat erhebliche Auswirkungen auf Skripte wie Tamil:
Eingeschränkte Ausdrucksfähigkeit: Ohne die Kombination von Markierungen ist es nahezu unmöglich, aussagekräftige Bezeichner auf Tamilisch zu schreiben.
Bildungsbarrieren: Die Verwendung nativer Skripte kann das Erlernen des Programmierens leichter machen, aber diese Einschränkungen behindern diese Möglichkeit, insbesondere für Sprachen, die dem Abugida-basierten Schriftsystem folgen.
Inklusivitätsherausforderungen: Während Go mit seiner UTF-8-Unterstützung auf Inklusivität abzielt, schließen die Einschränkungen beim Kombinieren von Marken viele Sprachen aus, die darauf angewiesen sind.
Die UTF-8-Unterstützung von Go ist ein großer Schritt hin zu einer inklusiveren Programmierung. Der Ausschluss von Kombinationszeichen in Bezeichnern schafft jedoch Hindernisse für Sprachen wie Tamil, Hindi und Arabisch, wo Kombinationszeichen integraler Bestandteil der Schrift sind.
Für mich als Entwickler aus Tamilnadu, der hauptsächlich mit Go arbeitet, war diese Entdeckung sowohl aufregend als auch etwas enttäuschend. Es beleuchtet die Komplexität einer echten Internationalisierung in Programmiersprachen.
Absolut! Nicht so sehr, abgesehen von der ostasiatischen Region, wo das auf „Abugida“ basierende Schriftsystem nicht befolgt wird.
Und natürlich hätten die Macher von Go die UTF-8-Konformität für die „Muttersprachliche Codierung“ von vornherein nicht vorgesehen. Der Grund lag eher in der Bereitstellung einer besseren ASCII-Verarbeitung, der Angleichung an moderne Webstandards, einer konsistenten String-Verarbeitung und einem Schritt in Richtung Interoperabilität.
Dieser Versuch war nur meine Neugier, zu verstehen, wie weit wir die UTF-8-Konformität in Go bringen können. Als jemand, der an der Entwicklung skalierbarer, verteilter Fintech-Systeme in Go arbeitet, fand ich es wichtig, sich dieser Nuancen bewusst zu sein.
Das ist alles. Danke fürs Mitlesen.
Viel Spaß beim Codieren :) Möge der Code mit dir sein.
Das obige ist der detaillierte Inhalt vonGo's UTF-Unterstützung: Eine interessante Einschränkung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!