我该如何在Google表格中将Unicode字符标准化/转换为ASCII字符?

8

我正在尝试为Google Sheets编写一个公式,将带有变音符号的Unicode字符转换为它们的纯ASCII等效字符。

我发现Google在其“REGEXREPLACE”函数中使用了RE2。而且我看到RE2提供了Unicode字符类

我尝试编写一个公式(类似于这个):

REGEXREPLACE("público","(\pL)\pM*","$1")

但是 Sheets 产生了以下错误:

函数 REGEXREPLACE 的第二个参数值 "\pL" 不是有效的正则表达式。

我想我可以编写一个由一堆嵌套的 SUBSTITUTE 函数(像这样的函数)组成的公式,但那看起来相当糟糕。

有人能提供一个更好的方法来规范化带重音符号/变音符号的 Unicode 字母吗?

3个回答

8

[[:^alpha:]](否定ASCII字符类)对于REGEXEXTRACT公式有效。

但是,=REGEXREPLACE("público","([[:alpha:]])[[:^alpha:]]","$1")的结果是“pblic”。所以我想,公式不知道应该用什么确切的ASCII字符来替换“ú”。


解决方法

让我们以单词públicē为例;我们需要替换其中的两个符号。将这个单词放在A1单元格中,并在B1单元格中输入以下公式:

=JOIN("",ArrayFormula(IFERROR(VLOOKUP(SPLIT(REGEXREPLACE(A1,"(.)","$1-"),"-"),D:E,2,0),SPLIT(REGEXREPLACE(A1,"(.)","$1-"),"-"))))

然后在 D:E 范围内创建替换目录:

    D    E  
1   ú   u
2   ē   e
3  ...  ...

这个公式看起来仍然不太好看,但更有用了,因为你可以通过将更多字符添加到表格中来控制目录。


或者使用 JavaScript

找到了一个好的解决方案,适用于 Google 表格。


两年后,我想我需要接受这个解决方案,但说实话,这些变通方法仍然相当丑陋。拜托,谷歌,快点修复吧! - Kirkman14
嗨,@Kirkman14。这个文本功能是我们目前所拥有的全部内容。更好的解决方案是编写自定义函数或在Google论坛上报告问题 - Max Makhrov

3
这对我在Google Sheets、Google Apps Scripts和GAS中做到了。
function normalizetext(text) {
    var weird = 'öüóőúéáàűíÖÜÓŐÚÉÁÀŰÍçÇ!@£$%^&*()_+?/*."';
    var normalized = 'ouooueaauiOUOOUEAAUIcC                 ';
    var idoff = -1,new_text = '';
    var lentext = text.toString().length -1

    for (i = 0; i <= lentext; i++) {
        idoff = weird.search(text.charAt(i));
        if (idoff == -1) {
            new_text = new_text + text.charAt(i);
        } else {
           new_text = new_text + normalized.charAt(idoff);
        }
    }

    return new_text;
}

2
这个答案不需要使用Google App Script,仍然很快,而且相对简单。它基于Max's的答案,提供了一个完整的查找表,并且还允许大小写敏感的音译(通常VLOOKUP是不区分大小写的)。
如果您想立即跳转到该表格,请点击此处的Google电子表格链接。如果您想使用自己的表格,则需要将TRANS_TABLE工作表复制到您的电子表格中。
在下面的代码片段中,源单元格是A2,因此您需要将此公式放置在第2行的任何列中。使用REGEXREPLACESPLIT,我们将A2中的字符串拆分为一个字符数组,然后使用ARRAYFORMULA,我们对数组中的每个字符执行以下操作:首先,将字符转换为其“十进制CODE等效形式,然后根据该数字匹配TRANS_TABLE工作表上的表,然后使用VLOOKUP在TRANS_TABLE工作表上向右移动X个列(提供的索引值),在这种情况下,返回第3列。当数组中的所有字符都被转换时,最终我们使用JOIN将字符数组合并回单个字符串。我还提供了带有named ranges的示例。
=iferror(
join(
  "",
  ARRAYFORMULA(
    vlookup(
      code(split(REGEXREPLACE($A2,"(.)", "$1;"),";",TRUE)),
      TRANS_TABLE!$A$5:$F,3
    )
  )
)
,)

在我制作的TRANS_TABLE表格中,您会注意到我创建了4个不同的音译列,这使得每个音译需求都有一个列变得容易。要引用该列,只需在VLOOKUP中使用不同的索引号即可。每个列都是一个替换字符列。在某些情况下,您不希望进行任何转换(A-> A或3-> 3),因此您只需从源字形列复制相同的字符即可。在需要转换字符的地方,您键入要替换的任何字符(ñ-> n等)。如果要完全删除字符,则将单元格留空(?->'')。您可以在数据表上看到音译输出的示例,其中我创建了4个不同的音译列(A-D),分别引用来自TRANS_TABLE表格的每个音译表以满足不同的用例场景。希望这样回答您的问题不那么“丑陋”。干杯。

工作得非常好。有一个建议,在TRANS_TABLE表中,如果您可以更新公式以使用TRANS_TABLE!TRANS_TABLE和TRANS_TABLE!TRANS_A,那么如果有人将您的工作表复制到他们的工作表中,然后将单元格公式复制到他们的单元格中,公式将起作用。 - Thomas Vander Stichele
我明白那很令人困惑...我在前四列中使用了“命名区域”。相反,我将命名区域版本拆分到单独的工作表中。 - Doomd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接