【问题标题】:How can I normalize / asciify Unicode characters in Google Sheets?如何规范化/asciify Google 表格中的 Unicode 字符?
【发布时间】:2016-06-09 00:08:42
【问题描述】:

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

我在“REGEXREPLACE”函数中看到了Google uses RE2。我看到了RE2 offers Unicode character classes

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

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

但表格会产生以下错误:

函数 REGEXREPLACE 参数 2 值“\pL”不是有效的正则表达式。

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

任何人都可以提供一种更好的方法来规范化 Google 表格公式中带有变音符号/重音符号的 Unicode 字母吗?

【问题讨论】:

    标签: regex unicode google-sheets formulas re2


    【解决方案1】:

    [[:^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  ...  ...
    

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


    或使用 Java Script

    还有found a good solution,它适用于谷歌表格。

    【讨论】:

    • 两年后,我想我需要接受这个解决方案,但老实说,这些解决方法仍然很丑陋。来吧,谷歌,解决这个问题!
    • 嗨,@Kirkman14.This text functions 是我们目前所拥有的。更好的解决方案是在谷歌论坛上编写自定义函数或reporting a problem
    【解决方案2】:

    这是在 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;
    }
    

    【讨论】:

      【解决方案3】:

      这个答案不需要谷歌应用脚​​本,它仍然很快,而且相对简单。它以Max's 答案为基础,提供完整的查找表,并且还允许区分大小写的音译(通常 VLOOKUP 不区分大小写)。

      如果您想直接跳转到Google Spreadsheet,这里有一个链接。如果您想使用自己的工作表,则需要将 TRANS_TABLE 工作表复制到电子表格中。

      在下面的代码 sn-p 中,源单元格是 A2,因此您可以将此公式放在第 2 行的任何列中。使用REGEXREPLACE AND SPLIT,我们将@987654332 中的字符串分开@ 转换成一个字符数组,然后使用 ARRAYFORMULA,我们对数组中的每个字符执行以下操作:首先,将字符转换为其等效的 'decimal'CODE,然后与 @ 上的表进行匹配987654333@ 表按该编号,然后使用VLOOKUP,返回 TRANS_TABLE 表(在本例中为第 3 列)上超过(提供的索引值)的字符 X 列。当数组中的所有字符都被音译后,我们最终将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),因此您只需从源 Glyph 列中复制相同的字符。在您确实要转换字符的地方,您输入要替换的任何字符(ñ -> n 等)。如果要完全删除一个字符,请将单元格留空 (? -> '')。您可以在数据表上查看音译输出示例,其中我创建了 4 个不同的音译列 (A-D),引用 TRANS_TABLE 表中针对不同用例场景的每个音译表。

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

      【讨论】:

      • 工作得非常好。一个建议是,在 TRANS_TABLE 工作表中,如果您可以更新那里的公式以使用 TRANS_TABLE!TRANS_TABLE 和 TRANS_TABLE!TRANS_A,那么如果有人将您的工作表复制到他们的工作表,然后将单元格公式复制到他们的单元格,这些公式就会起作用。跨度>
      • 我明白这有多令人困惑......我在前四列中使用了“命名范围”。相反,我将命名范围版本拆分为单独的工作表。
      猜你喜欢
      • 2018-04-16
      • 1970-01-01
      • 2015-11-01
      • 2012-02-07
      • 2011-12-10
      • 2011-06-20
      • 2014-10-28
      • 2023-03-06
      • 2013-04-05
      相关资源
      最近更新 更多