从字符串中删除无效的UTF-8字符(Go lang)

 仰望天空说再见 发布于 2023-02-12 17:13

我在字符串列表的json.Marshal上得到这个:

json: invalid UTF-8 in string: "...ole\xc5\"

原因很明显,但是如何在Go中删除/替换这些字符串?我一直在阅读docst unicodeunicode/utf8package,似乎没有明显/快速的方法来做到这一点.

例如,在Python中,您可以使用其中的方法来删除无效字符,替换为指定字符或严格设置,这会在无效字符上引发异常.我怎么能在Go中做同样的事情?

更新:我的意思是获得异常的原因(恐慌?) - json.Marshal期望有效的UTF-8字符串的非法字符.

(非法字节序列如何进入该字符串并不重要,通常的方式 - 错误,文件损坏,其他程序不符合unicode等)

2 个回答
  • 从Go 1.13开始,您还可以执行以下操作:

    strings.ToValidUTF8("a\xc5z", "")
    

    在Go 1.11中,使用Map函数和utf8.RuneError也是非常容易的,如下所示:

    fixUtf := func(r rune) rune {
        if r == utf8.RuneError {
            return -1
        }
        return r
    }
    
    fmt.Println(strings.Map(fixUtf, "a\xc5z"))
    fmt.Println(strings.Map(fixUtf, "posic?o"))
    

    输出:

    az
    posico
    

    游乐场: 在这里。

    2023-02-12 17:15 回答
  • 例如,

    package main
    
    import (
        "fmt"
        "unicode/utf8"
    )
    
    func main() {
        s := "a\xc5z"
        fmt.Printf("%q\n", s)
        if !utf8.ValidString(s) {
            v := make([]rune, 0, len(s))
            for i, r := range s {
                if r == utf8.RuneError {
                    _, size := utf8.DecodeRuneInString(s[i:])
                    if size == 1 {
                        continue
                    }
                }
                v = append(v, r)
            }
            s = string(v)
        }
        fmt.Printf("%q\n", s)
    }
    

    输出:

    "a\xc5z"
    "az"
    

    Unicode标准

    常见问题 - UTF-8,UTF-16,UTF-32和BOM

    问:是否有任何字节序列不是由UTF生成的?我应该如何解释它们?

    答:没有UTF可以生成每个任意字节序列.例如,在UTF-8中,形式为110xxxxx2的每个字节必须跟随一个10xxxxxx2形式的字节.诸如<110xxxxx2 0xxxxxxx2>之类的序列是非法的,绝不能生成.在转换或解释时遇到此非法字节序列时,符合UTF-8标准的进程必须将第一个字节110xxxxx2视为非法终止错误:例如,发出错误信号,过滤掉字节或用标记表示字节例如FFFD(REPLACEMENT CHARACTER).在后两种情况下,它将继续在第二个字节0xxxxxxx2处理.

    符合要求的过程不得将非法或格式错误的字节序列解释为字符,但是,它可能需要进行错误恢复操作.没有一致的过程可以使用不规则的字节序列来编码带外信息.

    2023-02-12 17:16 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有