【问题标题】:Lua unicode, using string.sub() with two-byted charsLua unicode,使用带有两字节字符的 string.sub()
【发布时间】:2017-08-25 14:50:30
【问题描述】:

例如:我想从字符串“ПРИВЕТ”和“HELLO”中删除前 2 个字母。其中之一仅包含两个字节的 unicode 符号。

尝试使用 string.sub("ПРИВЕТ") 和 string.sub("HELLO.")

得到“РИВЕТ”和“LLO.”。

string.sub() 从这些字符串中删除了 2 个字节(不是字符)。所以我想知道如何删除 chars

一些东西,比如 utf8.sub()

【问题讨论】:

  • 删除 UTF-8 字符串中的第一个 N 字符:str = str:gsub(".[\128-\191]*", "", N)

标签: string unicode utf-8 lua char


【解决方案1】:

https://github.com/Stepets/utf8.lua,纯lua库,扩展标准功能支持utf8字符串。

【讨论】:

    【解决方案2】:

    我找到了一个更简单的解决方案(使用 offset() 的解决方案不适用于所有情况):

    function utf8.sub(s, i, j)
        return utf8.char(utf8.codepoint(s, i, j))
    end
    

    【讨论】:

      【解决方案3】:

      此任务的关键标准函数是utf8.offset(s,n),它给出了 s 的第 n 个字符的开始位置(以字节为单位)。

      所以试试这个:

      print(string.sub(s,utf8.offset(s,3),-1))
      

      您可以如下定义utf8.sub

      function utf8.sub(s,i,j)
          i=utf8.offset(s,i)
          j=utf8.offset(s,j+1)-1
          return string.sub(s,i,j)
      end
      

      (此代码仅适用于阳性j。有关一般情况,请参见http://lua-users.org/lists/lua-l/2014-04/msg00590.html。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-26
        • 2014-04-03
        • 2022-01-15
        • 1970-01-01
        • 2017-05-21
        • 2021-11-21
        • 2020-02-03
        • 1970-01-01
        相关资源
        最近更新 更多