在Go中将UTF-8转换为ISO8859-1的最佳方法

在Go中将UTF-8转换为ISO8859-1的最佳方法,go,character-encoding,transliteration,Go,Character Encoding,Transliteration,我正在尝试将UTF-8字符映射到它们的“相似”ISO8859-1表示形式。删除变音符号,但也将Ł等字符替换为L或ı替换为i 例如: Jose Kakısır应该成为Jose Kakisir 我知道删除变音符号可以这样做: // (From https://blog.golang.org/normalization#TOC_10.) import ( "unicode" "golang.org/x/text/transform" "golang.org/x/text/un

我正在尝试将UTF-8字符映射到它们的“相似”ISO8859-1表示形式。删除变音符号,但也将
Ł
等字符替换为
L
ı
替换为
i

例如:
Jose Kakısır
应该成为
Jose Kakisir

我知道删除变音符号可以这样做:

// (From https://blog.golang.org/normalization#TOC_10.)
import (
    "unicode"

    "golang.org/x/text/transform"
    "golang.org/x/text/unicode/norm"
)

isMn := func(r rune) bool {
    return unicode.Is(unicode.Mn, r) // Mn: nonspacing marks
}
t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC)
result, _, err := transform.String(t, "José Kakışır")
println(result)
打印出的
Jose Karısır
-
s
替换为
s
,但
s
未替换为
i

在Go中实现这一点的最佳方法是什么?

我相信该软件包可以通过
charmap.ISO8859\u 1.NewEncoder()实现您想要的功能。

编辑:无需担心,这将在不受支持的符文上呕吐。很抱歉不过,这可能值得进一步研究


最终,感觉您需要找到(或创建)从UTF-8到ISO8859的映射。我不认为你会在那里找到“标准”字符,因为映射太随意了。

Unicode规范中有两个想法可以用来识别“相似”字符

第一种是将字符分解为基本字符+组合标记。您的代码利用了这一点:进行分解,然后删除组合标记,保留基本字符

但不幸的是,由于某种原因,“i”字符并没有分解成一个无点的“ı”加上一个组合点(如果有人理解为什么做出这个决定,请评论!)。这里也讨论了这一事实:

第二个是将字符映射到Unicode TR39中定义的“可混淆”字符。例如,您将在中找到以下行

0131;0069 ; 硕士→ i)拉丁文小写字母DOTLESS i→ 拉丁文小写字母I#


此映射的存在是为了识别出于安全目的可能与其他字符串“混淆”的字符串(例如,欺骗域)。它允许您将字符串转换为其“骨架”:具有相同骨架的两个字符串可能会明显混淆。比如说“谢谢,是的,这将与
编码一起呕吐:编码不支持符文。
。对于映射,我想一定有类似于音译映射的东西,但到目前为止,我也没有找到一个。问题是有太多的语言需要正确的音译,但我已经可以用一个简单的常用“欧洲”字符子集了。即使是iconv也不高兴:
echo“JoséKakısır”|iconv-f UTF8-t ISO8859-1
失败于:
Jos� Kakiconv:9号位置的非法输入序列
我也是:)iconv有
-c
命令行选项,这应该会让它高兴;-)我认为可以尝试为
ISO-8859-1
包装一个编码器,为。