2016-04-05 17 views
1

https://en.wikipedia.org/wiki/UTF-8#Invalid_code_points'dan U + D800 ile U + DFFF'nin geçersiz olduğunu bilmeliyim. Böylece ondalık sistemde 57293 ile 55296'dır.Neden utf8.Validstring işlevi geçersiz unicode karakterleri tespit etmiyor?

Ve en büyük Unicode '\ U0010FFFF'dir. ondalık sistemde, 1114111

Benim kodudur:

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 işlevi girdi olarak verilen geçersiz unicode karakterleri için sahte dönmüyor Neden? Eminim anlayışım yanlış, bazıları açıklayabilir mi?

cevap

3

Senin sorunun sprintf olur. Geçersiz bir karakter verdiğinizden Sprintf, geçersiz karakterler yerine kullanılan unicode değiştirme karakteri olan rune(65533) ile değiştirir. Yani dizginiz geçerli UTF8.

Bu, aşağıdaki gibi bir şey yaparsanız da gerçekleşir: str := string([]rune{ 55297 }) Bu nedenle runes oluştururken gerçekleşen bir şey olabilir.

str := string([]byte{237, 159, 193}) 
: Geçersiz UTF8 içerecek biçimde dize zorlamak istiyorsanız https://blog.golang.org/strings

böyle birinci dize yazabilirsiniz: Bu hemen belli değil

2

Geçersiz bir değer alıp Sprintf kullanarak dönüştürüyorsunuz. Hata değerine dönüştürüldü. Daha sonra geçerli bir Unicode kod noktası olan hata değerini kontrol edersiniz.

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") 
    } 

} 

Çıktı:

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 
İlgili konular