2013-05-22 8 views
18

Jeśli uruchomisz fmt.Println("\u554a"), wyświetli się "啊".Jak przekonwertować runę na ciąg znaków w stylu Unicode, jak ` u554a` w Golang?

Ale jak uzyskać ciąg znaków w stylu Unicode \u554a z runy "啊"?

+0

dlaczego chcesz to zrobić? – newacct

+0

Bardzo często używa się stylu '\ uXXXX' zamiast żadnego znaku ASCII, takiego jak" 世界 "w danych json. Proszę wypróbować te dane json '{" one ":" \ u554a "," two ":" 啊 "}' przez 'jquery.getJSON()'. I na stronie można znaleźć jeden jest w porządku, ale dwa pokazuje niechlujny kod. – hardPass

+0

Nie jest powszechne. Mylisz się co do JSON. JSON składa się z sekwencji znaków. Dowolny znak spoza ASCII może być użyty w JSON. Prawdopodobnie używasz JSON źle. – newacct

Odpowiedz

10

IMHO powinno być lepiej:

func RuneToAscii(r rune) string { 
    if r < 128 { 
     return string(r) 
    } else { 
     return "\\u" + strconv.FormatInt(int64(r), 16) 
    } 
} 
1

Na przykład

package main 

import "fmt" 

func main() { 
    r := rune('啊') 
    u := fmt.Sprintf("%U", r) 
    fmt.Println(string(r), u) 
} 

wyjścia:

啊 U+554A 
+0

Powszechne jest używanie '\ u554A' w jsonie, a nie' U + 554A'.Aby uzyskać '\ u554A', nadal potrzebujesz wykonać dodatkowe operacje. To nie jest wystarczająco miłe. – hardPass

15
package main 

import "fmt" 
import "strconv" 

func main() { 
    quoted := strconv.QuoteRuneToASCII('啊') // quoted = "'\u554a'" 
    unquoted := quoted[1:len(quoted)-1]  // unquoted = "\u554a" 
    fmt.Println(unquoted) 
} 

This wyjścia:

 
\u554a 
+0

Istnieje cytowana wersja dla 'RuneToASCII' w oficjalnym pakiecie, ale dlaczego nie dać nam bezpośredniego func bez cytatu. Obawiam się, że nie jest to wystarczająco gładkie, ponieważ dotyczy to cytatu. Więc po prostu podaję func 'RuneToASCII' powyżej. Wydaje się bardziej skuteczny. – hardPass

+0

@hardPass Trochę wolę swoją drogę, ale lubię też twoją i widzę, dlaczego wolisz. To jest Twoje pytanie, możesz zaznaczyć własną jako wybraną odpowiedź. –

+0

Czy istnieje inna funkcja, aby przejść w drugą stronę? '\ u554a' -> 啊? – 425nesp

4

Można używać fmt.Sprintf wraz z %U uzyskać wartość szesnastkową:

test = fmt.Sprintf("%U", '啊') 
fmt.Println("\\u" + test[2:]) // Print \u554A 
+0

Masz rację. Powinno być ok, po prostu konwertując je do wartości szesnastkowej. I ten func powinien być bardziej wydajny: 'func RuneToAscii (r rune) string', który jest powyżej pokazany – hardPass

1
fmt.Printf("\\u%X", '啊') 

http://play.golang.org/p/Jh9ns8Qh15

(górna lub mała litera 'x' będzie kontrolował przypadku znaków hex)

jako zasugerowane przez pakiet fmt's documentation:

% U Format Unicode: U + 1234; taki sam jak "U +% 04X"

+0

Kiedy wejście jest już assii, chciałbym, żeby było samo. Podobnie jak "a" wprowadzono, zwróć "a" zamiast "\ u61". Powinienem wspomnieć o tym wcześniej. Wygląda na to, że nie traktujecie tego jako powszechnego wymogu. Naprawdę o tym mówiłem. Ach, ale dobrze, że mam func, mogę wykonać swoją pracę. – hardPass

+0

To powinna być wybrana odpowiedź - w ogóle nie potrzebujesz pakietu "strconv". – xpt

Powiązane problemy