如何规范化/asciify Google 表格中的 Unicode 字符?

How can I normalize / asciify Unicode characters in Google Sheets?

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

我看到 Google uses RE2 in its "REGEXREPLACE" function. And I see that RE2 offers Unicode character classes.

我试着写了一个公式(类似于this one):

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

但表格产生以下错误:

Function REGEXREPLACE parameter 2 value "\pL" is not a valid regular expression.

我想我可以写一个由一长串嵌套 SUBSTITUTE 函数组成的公式 (Like this one),但这看起来很糟糕。

任何人都可以提供一个更好的方法来规范化 Google Sheets 公式中带有 diacritical/accent 标记的 Unicode 字母的建议吗?

[[:^alpha:]](取反的 ASCII 字符 class)适用于 REGEXEXTRACT 公式。

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


解决方法

我们就拿单词来说吧públicē;我们需要替换其中的两个符号。将这个词放在单元格 A1 中,将这个公式放在单元格 B1 中:

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

然后在 D:E:

范围内创建替换目录
    D    E  
1   ú   u
2   ē   e
3  ...  ...

这个公式仍然很难看,但更有用,因为您可以通过向 table 添加更多字符来控制您的目录。


或使用Java脚本

还有 found a good solution,可在 google 张中使用。

这是在 Google 表格、Google Apps 脚本、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;
}

这个答案不需要 Google 应用程序脚本,而且速度仍然很快,而且相对简单。它通过提供完整查找 table 建立在 Max's 答案的基础上,它还允许区分大小写的音译(通常 VLOOKUP 不区分大小写)。

这里是 link 到 Google Spreadsheet 如果你想直接跳进去的话。如果您想使用自己的 sheet,您需要将 TRANS_TABLE sheet 复制到您的 Spreadsheet.

在下面的代码片段中,源单元格是 A2,因此您可以将此公式放在第 2 行的任意列中。也可以使用 REGEXREPLACE AND SPLIT, we split apart the string in A2 into an array of characters, then USING ARRAYFORMULA, we do the following to EACH character in the array: First, the character is converted to its 'decimal' CODE equivalent, then matched against a table on the TRANS_TABLE sheet by that number, then using VLOOKUP, a character X number of columns over (the index value provided) on the TRANS_TABLE sheet (in this case, the 3rd column over) is returned. When all characters in the array have been transliterated, we finally JOIN the array of characters back into a single string. I provided examples with named ranges

=iferror(
join(
  "",
  ARRAYFORMULA(
    vlookup(
      code(split(REGEXREPLACE($A2,"(.)", ";"),";",TRUE)),
      TRANS_TABLE!$A:$F,3
    )
  )
)
,)

您会在我制作的 TRANS_TABLE sheet 中注意到,我创建了 4 个不同的音译列,这使得您可以轻松地为每个音译需求创建一个列。要引用该列,只需在 VLOOKUP 中使用不同的索引号。每列只是一个替换字符列。在某些情况下,您不希望进行任何转换(A -> A 或 3 -> 3),因此您只需从源 Glyph 列复制相同的字符。在您想转换字符的地方,您可以输入要替换的任何字符(ñ -> n 等)。如果您想要完全删除一个字符,请将该单元格留空 (? -> '')。您可以在数据 sheet 上看到音译输出示例,其中我创建了 4 个不同的音译列 (A-D),引用 TRANS_TABLE sheet 中的每个音译 table针对不同的用例场景。

我希望这最终能以一种不那么“丑陋”的方式回答您的问题。干杯。