【问题标题】:read text file which has been encoded with UCS-2 little Endian using Go使用 Go 读取已使用 UCS-2 little Endian 编码的文本文件
【发布时间】:2019-12-30 10:48:12
【问题描述】:

我有一个 Go 程序来读取类似于以下代码的文本文件:

package main

import (
    "bufio"
    "log"
    "os"
)

func main() {
    file, err := os.Open("test.txt")

    if err != nil {
        log.Fatalf("failed opening file: %s", err)
    }

    scanner := bufio.NewScanner(file)
    scanner.Split(bufio.ScanLines)
    var txtlines []string

    for scanner.Scan() {
        txtlines = append(txtlines, scanner.Text())
    }

    file.Close()
}

游乐场:https://play.golang.org/p/cnDOEFaT0lr

该代码适用于所有文本文件,但使用 UCS-2 little endian 编码的文件除外。如何将文件转换为 UFT8 格式进行读取?

【问题讨论】:

    标签: go utf-8 ucs2


    【解决方案1】:

    我有一个 Go 程序来读取文本文件。如何将[UCS-2 little endian]文件转为UFT-8格式读取?


    Unicode

    FAQ: UTF-8, UTF-16, UTF-32 & BOM

    问:What is the difference between UCS-2 and UTF-16?

    答:UCS-2 是过时的术语,指的是 Unicode 最高 Unicode 1.1 的实现,在代理代码点和 UTF-16 被添加到标准的 2.0 版中。这个词现在应该 避免。

    UCS-2 没有描述不同于 UTF-16 的数据格式,因为 两者都使用完全相同的 16 位代码单元表示。然而, UCS-2 不解释代理代码点,因此不能 用于一致地表示补充字符。

    过去,有时某个实现被标记为“UCS-2”以 表示它不支持补充字符并且不 将代理代码点对解释为字符。这样一个 实现不会处理字符属性的处理, 补充字符的代码点边界、排序规则等。

    UCS-2 是 UTF-16 的真子集。


    例如,

    package main
    
    import (
        "bufio"
        "fmt"
        "os"
    
        "golang.org/x/text/encoding/unicode"
    )
    
    func main() {
        // "Language Learning and Teaching" written in 16 or more languages: UCS-2
        // http://www.humancomp.org/unichtm/unilang.htm
        f, err := os.Open("unilang.htm")
        if err != nil {
            fmt.Fprintln(os.Stderr, err)
            os.Exit(1)
        }
        defer f.Close()
    
        dec := unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewDecoder()
        scn := bufio.NewScanner(dec.Reader(f))
        for scn.Scan() {
            fmt.Println(scn.Text())
        }
        if err := scn.Err(); err != nil {
            fmt.Fprintln(os.Stderr, err)
            os.Exit(1)
        }
    }
    

    游乐场:https://play.golang.org/p/3VombFxUNb1

    【讨论】:

    • 上面的代码对我来说很好。感谢您的回复。现在使用相同的代码我无法读取文件“在没有BOM的情况下以UTF-8编码”。有没有办法找到文件的编码?这样我就可以只为 UCS-2 编码文件使用这个逻辑?
    猜你喜欢
    • 1970-01-01
    • 2021-11-30
    • 2013-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多