2016-04-05 18 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文字のためにfalseを返すされていないのはなぜ?私の理解が間違っていると確信しています。

答えて

3

あなたの問題は、sprintfの中で起こります。 Sprintfが無効な文字の代わりに使用されるUnicodeの置換文字であるrune(65533)で置き換えられます。したがって、あなたの文字列は有効なUTF8です。

これは、次のような場合にも発生します。str := string([]rune{ 55297 })これは、ルーンの作成時に発生する可能性があります。あなたは、このような最初の文字列を記述することができ、無効なUTF8を含むように、あなたの文字列を強制したい場合はhttps://blog.golang.org/strings

:それはすぐに明らかではありませんから

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 
関連する問題