Comment lire utf16 fichier texte à la chaîne dans golang?
Je peux lire le fichier de tableau d'octets
mais quand je les convertir en string
il traiter l'utf16 octets ascii
Comment convertir correctement?
package main
import ("fmt"
"os"
"bufio"
)
func main(){
//read whole the file
f, err := os.Open("test.txt")
if err != nil {
fmt.Printf("error opening file: %v\n",err)
os.Exit(1)
}
r := bufio.NewReader(f)
var s,b,e = r.ReadLine()
if e==nil{
fmt.Println(b)
fmt.Println(s)
fmt.Println(string(s))
}
}
de sortie:
faux
[255 254 91 0 83 0 99 0 114 0 105 0 112 0 116 0 32 0 73 0 110 0 102 0 111 0 93 0
13 0]
S c r i p t I o n de f o ]
Mise à jour:
Après j'ai testé les deux exemples, j'ai understanded quel est le problème exact maintenant.
Dans windows, si j'ajoute un saut de ligne (CR+LF) à la fin de la ligne, le CR sera lu dans la ligne. Parce que la fonction readline ne peut pas gérer l'unicode correctement ([OD OA]=ok, [OD 00 OA 00]=pas ok).
Si la fonction readline peut reconnaître unicode, il faut comprendre [OD 00 OA 00] et retour []uint16 au lieu de []bytes.
Donc je pense que je ne devrais pas utiliser bufio.NewReader comme il n'est pas capable de lire utf16, je ne vois pas bufio.NewReader.ReadLine peut accepter des paramètres comme indicateur pour indiquer que la lecture de texte est utf8, utf16le ou utf32. Est-il readline fonction de texte unicode en aller à la bibliothèque?
Vous devez vous connecter pour publier un commentaire.
UTF16, UTF8, et l'Ordre des Octets de Marques sont définis par la Consortium Unicode: UTF-16 FAQ, UTF-8 FAQ, et Marque d'Ordre des octets (BOM) FAQ.
Voici un programme qui utilise l'Unicode des règles pour convertir UTF16 fichier texte les lignes pour Aller encodés en utf-8 cordes. Le code a été révisé afin de prendre avantage de la nouvelle
bufio.Scanner
interface en Aller 1.1.De sortie:
bufio.Scanner
au lieu debufio.Readline
etbufio.ReadBytes
et a de nombreuses autres améliorations de trop. Exécuter à l'aide de Aller 1.1 ou mieux.La dernière version de
golang.org/x/text/encoding/unicode
rend plus facile de le faire parce qu'il comprendunicode.BOMOverride
, ce qui se fait de manière intelligente interpréter la NOMENCLATURE.Ici est ReadFileUTF16(), qui est comme de l'os.ReadFile (), mais décode UTF-16.
Ici est NewScannerUTF16, qui est comme l'os.Open (), mais renvoie à un scanner.
Pour info: j'ai mis ces fonctions dans un module open source et ont fait d'autres améliorations. Voir https://github.com/TomOnTime/utfutil/
Par exemple:
(Également ici)
De sortie:
encoding/binary
de le lire comme un []uint16 pour commencer.Ici est la façon la plus simple de le lire:
depuis Windows little-endian ordre par défaut lien, nous utilisons le format unicode.UseBOM politique pour récupérer de la NOMENCLATURE du texte, et unicode.Little-endian comme un secours
Si tu veux quelque chose à imprimer sous la forme d'une chaîne vous pouvez utiliser
fmt.Sprint