2013-05-22 57 views
18

如果您運行fmt.Println("\u554a"),它會顯示'啊'。如何將符文轉換爲像Golang中的` u554a`這樣的unicode-style-string?

但如何從符文'啊'獲得unicode樣式字符串\u554a

+0

爲什麼要這樣做? – newacct

+0

在json數據中使用'\ uXXXX''風格代替'ASCII'字符非常普遍。請用'jquery.getJSON()'試試這個json數據'{「one」:「\ u554a」,「two」:「啊」}'。在頁面上,你可以找到一個好的,但兩個顯示雜亂的代碼。 – hardPass

+0

這並不常見。你誤解了JSON。 JSON由一系列字符組成。任何非ASCII字符都可以在JSON中使用。你可能使用JSON錯誤。 – newacct

回答

10

IMHO,它應該是更好:

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

例如,

package main 

import "fmt" 

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

輸出:

啊 U+554A 
+0

在json中使用'\ u554A'常見,而不是'U + 554A'。要獲得'\ u554A',你仍然需要做一些額外的操作。它不夠整齊。 – 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) 
} 

此輸出:

 
\u554a 
+0

官方包中有一個'RuneToASCII'的引用版本,但爲什麼不給我們直接的func沒有引用。恐怕這不夠整齊,因爲處理這個報價。所以我只是給上面的一個func'RuneToASCII'。它似乎更有效率。 – hardPass

+0

@hardPass我稍微喜歡我的方式,但我也喜歡你的方式,我可以看到你爲什麼喜歡它。這是你的問題,隨意標記你自己作爲選擇的答案。 –

+0

另一種功能是否有另一種方式? '\ u554a' - >啊? – 425nesp

4

您可以使用fmt.Sprintf%U一起獲得十六進制值:

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

你說得對。只要將它轉換爲十六進制值即可。這個func應該更有效率:'func RuneToAscii(r rune)string',上面顯示的是 – hardPass

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

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

(大寫或小寫的 'X' 將控制十六進制字符的情況下)

作爲暗示在包裹fmt的documentation

%U統一碼格式:U + 1234;與「U +%04X」相同

+0

當輸入已經是assii時,我希望它是自己。像'a'輸入一樣,返回'a'而不是'\ u61'。我應該早些提到這一點。看起來你們不把這當作一種常見的要求。我真的很擔心這件事。啊,但是我有一個func可以完成我的工作。 – hardPass

+0

這應該是選擇的答案 - 根本不需要'strconv'包。 – xpt

相關問題