2017-03-29 8 views
0

die folgende Eingabe Gegeben:Golang konvertiert integer zu Unicode-Zeichen

intVal := 2612 
strVal := "2612" 

Was zu dem zugehörigen Unicode-Wert als Zeichenfolge ein Mechanismus für die Abbildung ist.

Zum Beispiel kann der folgende Code druckt "☒"

fmt.Println("\u2612") 

Aber die folgend nicht funktioniert:

fmt.Println("\\u" + strVal) 

Ich recherchieren Runen, strconv und unicode/utf8 konnte aber keine geeigneten finden Umsetzungsstrategie.

Antwort

4

2612 ist nicht der Integer-Wert der Unicode-Rune, der Integer-Wert von \u2612 ist 9746. Die Zeichenfolge "2612" ist der Hexadezimalwert der Rune, also analysiere sie als Hexadezimalzahl und wandle sie in eine rune um.

i, err := strconv.ParseInt(strVal, 16, 32) 
if err != nil { 
    log.Fatal(err) 
} 
r := rune(i) 
fmt.Println(string(r)) 

https://play.golang.org/p/t_e6AfbKQq

+1

Ich würde bemerken, dass 'strconv.ParseInt()' gibt einen Wert vom Typ 'uint64' zurück, egal welche Bitgröße angegeben wurde. In einem weniger Spielzeugbeispiel müsste man das Ergebnis wahrscheinlich in' rune' umwandeln . – kostix

+0

@kostix: guter Punkt, das passiert implizit in der String-Konvertierung. – JimB

2

Dies funktioniert:

fmt.Println("\u2612") 

Da ein interpreted string literal im Quellcode angegeben wird, und die Compiler unquote (interpretieren) es. Es ist nicht das fmt-Paket, das diese Nichtquotierung verarbeitet.

funktioniert das nicht:

fmt.Println("\\u" + strVal) 

Weil wieder eine interpretierte Stringliteral verwendet wird, die \u zu einem string Wert gelöst werden und dann wird es mit dem Wert der lokalen Variablen strVal verkettet werden, die ist 2612, so wird der endgültige string Wert \u2612 sein. Dies ist jedoch kein interpretiertes String-Literal, dies ist das "endgültige" Ergebnis. Dies wird nicht weiter bearbeitet.

Alternativ zu JimBs Antwort können Sie auch strconv.Unquote() verwenden, die ähnlich wie der Compiler tut.

Sehen Sie folgendes Beispiel:

// The original that works: 
s := "\u2612" 
fmt.Println(s, []byte(s)) 

// Using strconv.Unquote(): 
strVal := "2612" 
s2, err := strconv.Unquote(`"\u` + strVal + `"`) 
fmt.Println(s2, []byte(s2), err) 
fmt.Println(s == s2) 

Output (versuchen Sie es auf dem Go Playground):

☒ [226 152 146] 
☒ [226 152 146] <nil> 
true 

hier etwas zu beachten: Wir haben den \u2612 Text von strconv.Unquote() unquote wollen, aber Unquote() erfordert, dass Die Zeichenfolge, die nicht in Anführungszeichen gesetzt werden soll ("Unquote interpretiert s als ein einfaches, doppelt zitiertes oder backquoted Go-String-Literal ..."), deshalb veröffentlichen wir vor und nach habe es mit einem Anführungszeichen versehen.

Verwandte Themen