2016-04-05 68 views
1

https://en.wikipedia.org/wiki/UTF-8#Invalid_code_points,我知道U + D800通過U + DFFF是無效的。所以在十進制系統中,它是55296到57343.爲什麼utf8.Validstring函數沒有檢測到無效的unicode字符?

最大有效Unicode是'\ U0010FFFF'。在十進位制,它是1114111

我的代碼:

package main 

import "fmt" 
import "unicode/utf8" 

func main() { 

    fmt.Println("Case 1(Invalid Range)") 
    str := fmt.Sprintf("%c", rune(55296+1)) 
    if !utf8.ValidString(str) { 
     fmt.Print(str, " is not a valid Unicode") 
    } else { 
     fmt.Println(str, " is valid unicode character") 
    } 

    fmt.Println("Case 2(More than maximum valid range)") 
    str = fmt.Sprintf("%c", rune(1114111+1)) 
    if !utf8.ValidString(str) { 
     fmt.Print(str, " is not a valid Unicode") 
    } else { 
     fmt.Println(str, " is valid unicode character") 
    } 
} 

爲什麼ValidString功能沒有返回給定輸入無效Unicode字符假的?我相信我的理解是錯誤的,有人可以解釋嗎?

回答

3

你的問題發生在sprintf的。既然你給它一個無效的字符Sprintf用rune(65533)替代,這是使用Unicode代替字符而不是無效字符。所以你的字符串是有效的UTF8。

這也會發生,如果你這樣做:str := string([]rune{ 55297 })所以這可能是創建符文時發生的事情。這不是顯而易見的:https://blog.golang.org/strings

如果要強制字符串包含無效的UTF8你可以寫第一個字符串是這樣的:

str := string([]byte{237, 159, 193}) 
2

您採用無效值並使用Sprintf進行轉換。它被轉換爲錯誤值。然後檢查錯誤值,這是一個有效的Unicode代碼點。

package main 

import (
    "fmt" 
    "unicode/utf8" 
) 

func main() { 

    fmt.Println("Case 1: Invalid Range") 
    str := fmt.Sprintf("%c", rune(55296+1)) 
    fmt.Printf("%q %X %d %d\n", str, str, []rune(str)[0], utf8.RuneError) 
    if !utf8.ValidString(str) { 
     fmt.Print(str, " is not a valid Unicode") 
    } else { 
     fmt.Println(str, " is valid unicode character") 
    } 

    fmt.Println("Case 2: More than maximum valid range") 
    str = fmt.Sprintf("%c", rune(1114111+1)) 
    fmt.Printf("%q %X %d %d\n", str, str, []rune(str)[0], utf8.RuneError) 
    if !utf8.ValidString(str) { 
     fmt.Print(str, " is not a valid Unicode") 
    } else { 
     fmt.Println(str, " is valid unicode character") 
    } 

} 

輸出:

Case 1: Invalid Range 
"�" EFBFBD 65533 65533 
� is valid unicode character 
Case 2: More than maximum valid range 
"�" EFBFBD 65533 65533 
� is valid unicode character 
相關問題