如何获取字符串中的字符数

2023-12-27

Go中如何获取字符串的字符数?

例如,如果我有一个字符串"hello"该方法应该返回5。我看到了len(str)返回字节数and not字符数所以len("£")返回 2 而不是 1,因为 £ 在 UTF-8 中使用两个字节进行编码。


你可以试试RuneCountInString http://golang.org/pkg/unicode/utf8/#RuneCountInString来自 utf8 包。

返回 p 中的符文数量

即,如图所示这个脚本 http://play.golang.org/p/zzB1VrwdER:“World”的长度可能是6(中文写成“世界”),但“世界”的符文数是2:

package main
    
import "fmt"
import "unicode/utf8"
    
func main() {
    fmt.Println("Hello, 世界", len("世界"), utf8.RuneCountInString("世界"))
}

Phrozen https://stackoverflow.com/users/383848/phrozen adds 在评论中 https://stackoverflow.com/questions/12668681/go-language-string-length/12668840#comment39875126_12668840:

其实你可以做len()仅通过类型转换来覆盖符文。
len([]rune("世界"))将打印2。至少在 Go 1.3 中是这样。


CL 108985 https://go-review.googlesource.com/c/go/+/108985(2018 年 5 月,Go 1.11),len([]rune(string))现已优化。 (修复问题 24923 https://github.com/golang/go/issues/24923)

编译器检测到len([]rune(string))自动模式,并将其替换为 for r := range s 调用。

添加一个新的运行时函数来计算字符串中的符文数量。 修改编译器以检测模式len([]rune(string))并将其替换为新的符文计数运行时函数。

RuneCount/lenruneslice/ASCII        27.8ns ± 2%  14.5ns ± 3%  -47.70%
RuneCount/lenruneslice/Japanese     126ns ± 2%   60  ns ± 2%  -52.03%
RuneCount/lenruneslice/MixedLength  104ns ± 2%   50  ns ± 1%  -51.71%

斯特凡·施泰格 https://stackoverflow.com/users/155077/stefan-steiger指向博客文章“Go 中的文本规范化 https://blog.golang.org/normalization"

什么是角色?

正如在字符串博客文章 http://blog.golang.org/strings, 字符可以跨越多个符文.
例如,一个 'e' 和 '◌́◌́'(锐音“\u0301”)可以组合形成 'é'(“e\u0301“在 NFD 中)。这两个符文合在一起就是一个字符.

字符的定义可能因应用程序而异。
For 正常化 https://godoc.org/golang.org/x/text/unicode/norm我们将其定义为:

  • 以启动器开始的一系列符文,
  • 不会修改或与任何其他符文向后组合的符文,
  • 接下来是可能为空的非起始序列,即符文(通常是重音符号)。

标准化算法一次处理一个字符。

使用该包及其Iter type https://godoc.org/golang.org/x/text/unicode/norm#Iter,“字符”的实际数量为:

package main
    
import "fmt"
import "golang.org/x/text/unicode/norm"
    
func main() {
    var ia norm.Iter
    ia.InitString(norm.NFKD, "école")
    nc := 0
    for !ia.Done() {
        nc = nc + 1
        ia.Next()
    }
    fmt.Printf("Number of chars: %d\n", nc)
}

在这里,这使用了Unicode 规范化形式 http://unicode.org/reports/tr15/#Norm_FormsNFKD《兼容性分解》


Oliver https://stackoverflow.com/users/2046109/oliver's answer https://stackoverflow.com/a/55151396/6309指着UNICODE 文本分割 http://unicode.org/reports/tr29/作为可靠地确定某些重要文本元素(用户感知的字符、单词和句子)之间的默认边界的唯一方法。

为此,您需要一个外部库,例如里沃/尤尼塞格 https://github.com/rivo/uniseg,这确实Unicode 文本分割.

这实际上会算“grapheme https://en.wikipedia.org/wiki/Grapheme cluster”,其中多个代码点可以组合成一个用户感知的字符。

package uniseg
    
import (
    "fmt"
    
    "github.com/rivo/uniseg"
)
    
func main() {
    gr := uniseg.NewGraphemes("????????!")
    for gr.Next() {
        fmt.Printf("%x ", gr.Runes())
    }
    // Output: [1f44d 1f3fc] [21]
}

两个字素,尽管有三个符文(Unicode 代码点)。

您可以在“中查看其他示例”如何操作GO中的字符串来反转它们? https://stackoverflow.com/a/62743214/6309"

????????‍???? 单独是一个字素,但是,从unicode 到代码点转换器 https://onlineunicodetools.com/convert-unicode-to-code-points, 4 个符文:

  • ????: 女性 (1f469) https://apps.timwhitlock.info/unicode/inspect/hex/1F469
  • 深色皮肤 (1f3fe) https://apps.timwhitlock.info/unicode/inspect/hex/1f3fe
  • 零宽度连接器 (200d) https://apps.timwhitlock.info/unicode/inspect/hex/200d
  • ????红发 (1f9b0) https://apps.timwhitlock.info/unicode/inspect/hex/1f9b0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取字符串中的字符数 的相关文章

  • Go 指针 - 通过指针将值附加到切片

    我有一个 struct ProductData 及其实例 p 它有一个切片属性 type ProductInfo struct TopAttributes map string interface 我想设置 TopAttributes 如下
  • Python3,当 UserString 不表现为字符串时?

    在Python3中我使用UserString扩展内置字符串的功能 通常UserStrings 的行为就像strs 但与re我遇到了意想不到的情况TypeError bpython version 0 17 1 on top of Pytho
  • PHP中特殊字符的转换

    我已经尝试了很多功能 但我根本无法弄清楚这一点 无论如何 正确的方法 在称为描述的表单字段中 我可以期待各种字符 在将它们提交到数据库之前 需要将它们格式化为 HTML 实体 现在 我的代码 formdesc htmlentities PO
  • Python,将字典存储在数据库中

    在数据库中存储和检索 python 字典的最佳方法是什么 如果您对使用传统 SQL 数据库 例如 MySQL 不是特别感兴趣 您可以研究非结构化文档数据库 其中文档自然映射到 python 字典 例如MongoDB http www mon
  • 结构体到磁盘的高效 Go 序列化

    我的任务是将 C 代码替换为 Go 而且我对 Go API 还很陌生 我正在使用 gob 将数百个键 值条目编码到磁盘页面 但 gob 编码有太多不需要的膨胀 package main import bytes encoding gob f
  • C++:字符串流有什么好处?

    谁能告诉我一些在 C 中使用字符串流的实际例子 即使用流插入和流提取运算符输入和输出到字符串流 您可以使用字符串流来转换任何实现operator lt lt 到一个字符串 include
  • 共享 GOPATH 的良好做法是什么?

    我刚刚开始学习 Go 并阅读现有代码以了解 其他人是如何做的 在这样做时 go 工作空间 的使用 特别是当它与项目的依赖项相关时 似乎无处不在 在处理各种 Go 项目时 使用单个或多个 Go 工作区 即 GOPATH 的定义 的常见最佳实践
  • Powershell 数组到带引号的逗号分隔字符串

    我有一个数组 需要输出到逗号分隔的字符串 但我还需要引号 这是我所拥有的 myArray file1 csv file2 csv a myArray join a 输出为 a最终 file1 csv file2 csv 我想要的输出是 fi
  • Notepad++:: 通过正则表达式完全删除包含问号的行

    嗯 我想这就是我的标题 这对于我将要实现的目标来说是不言自明的 这是我当前的文本文件的示例 Diva was the winning song of the Eurovision Song Contest 1998 Who will win
  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 在 python 3 中压缩字符串?

    我不明白 在 2 X 中它起作用了 import zlib zlib compress Hello world 现在我有一个 zlib compress Hello world TypeError must be bytes or buff
  • 使用自定义比较器在 Java 中创建 SortedMap

    我想创建一个TreeMap在 Java 中具有自定义排序顺序 排序后的键是字符串 需要根据第二个字符进行排序 这些值也是字符串 示例地图 Za FOO Ab Bar 您可以像这样使用自定义比较器 Comparator
  • 将字符串拆分为字母数组 - 双字符字母 PHP

    我需要将一个字符串拆分为一个字母数组 问题是在我的语言 克罗地亚语 中也有双字符字母 例如 lj nj d 所以字符串如ljubi icajecvijet应该分成一个数组 如下所示 Array 0 gt lj 1 gt u 2 gt b 3
  • 在 Java 和 C 中在运行时调用名为“string”的方法

    我们如何调用名称为的方法string在运行时 谁能告诉我如何在 Java 和 C 中做到这一点 在java中可以通过反射api来完成 看一下Class getMethod String methodName Class parameterT
  • 如何确定子字符串是否在不同的字符串中[重复]

    这个问题在这里已经有答案了 我有一个子字符串 substring please help me out 我还有另一个字符串 string please help me out so that I could solve this 我如何找到
  • 将 SQL Server varBinary 数据转换为字符串 C#

    我需要帮助弄清楚如何转换来自SQL服务器表列设置为varBinary 最大 转换为字符串以便将其显示在标签中 这是在C 我正在使用数据读取器 我可以使用以下方式提取数据 var BinaryString reader 1 我知道该列包含之前
  • 从 C 中的 char* 获取单个字符

    有没有办法在 C 中逐字符遍历或从 char 中提取单个字符 考虑以下代码 现在获得单个角色的最佳方式是什么 建议我一种不使用任何字符串函数的方法 char a STRING 其他方式 char i for i a i i i points
  • Go 中的数据竞争:为什么会在 10-11 毫秒以下发生?

    这是我运行的代码 package main import fmt time const delay 9 time Millisecond func main n 0 go func time Sleep delay n fmt Printl
  • 如何访问主包之外的标志?

    We 解析标志 http golang org pkg flag FlagSet Parse当然 在 main 包中的 main go 中 然后我们有另一个包 我们想在其中读取一些标志的值 flags Args http golang or

随机推荐

  • PHP 中的 Twitter 机器人有问题吗?

    我已经用 php 构建了一个 Twitter 机器人 它能够接收消息并响应消息 但出现了这个问题 当我向机器人发送消息时 我必须刷新机器人脚本才能让机器人回复 我希望机器人能够不断检查任何新传入的消息并做出相应的响应 我该如何修复这个错误
  • 复制/移动省略与显式删除的复制/移动构造函数

    我想知道复制 移动省略何时适用 或允许适用 显式deleted 复制 移动构造函数和非deleted 复制 移动构造函数 具体如下 可以明确地deleted 复制 ctor 或移动 ctor 被删除 是否尝试从另一个相同类型的对象或临时对象
  • 沙盒应用程序和 NSOpenPanel 导致崩溃

    我正在我的 Cocoa 应用程序中做一个简单的文件打开面板 我启用权利和应用程序沙箱 但在 OS X 10 9 上 当应用程序应使用以下命令打开对话框时NSOpenPanel 它崩溃了 应用具体信息 由于未捕获的异常 NSObjectNot
  • 如何在 XSLT 1.0 中查找当前日期

    我在检索 XSLT 代码中的当前日期时遇到麻烦 我正在使用 1 0 版和 MSXSL exe 应用程序来触发我的 xslt 代码 我尝试使用以下代码行来实现此功能 但它不起作用 貌似1 0版本不支持当前日期功能 您能否提供适用于 xslt
  • 在 JavaScript 中检查文本框值是字符串还是数字

    基本上我有以下代码
  • ld:重复符号

    我正在做一个学校项目 我从 Xcode 中收到一些奇怪的错误 我正在使用 TextMate 的 Command R 功能来编译该项目 编译似乎工作正常 但链接失败并出现我不明白的错误消息 ld输出 ld path final build f
  • 在 Kivy 中创建动态绘制的线条

    这是我的帖子的延续 在 Kivy 中使用和移动小部件 按钮 https stackoverflow com questions 25273046 using and moving widgets buttons in kivy 我想在 Ki
  • 如何在 statefulset 中设置 kubernetes pod 的主机名

    我正在使用 Statefulset 并且启动了多个 Pod 但它们不是彼此的复制品 我想设置 pod 的主机名 并将这些主机名作为环境变量传递给所有 pod 以便它们可以相互通信 我尝试在 pod 规范下使用主机名 但主机名永远不会设置为指
  • CUDA 共享内存问题(以及将 CUDA 与 python/ctypes 一起使用)

    不知怎的 当我修改时d updated water flow map在下面的代码中 d terrain height map也被修改 相反 更改两个数组的分配顺序可以解决问题 但我认为这只是掩盖了问题的根本原因 cudaCheck cuda
  • 此 for 循环的时间复杂度: for (i = 2; i < N; i = i * i)?

    我们现在正在学习时间复杂度 而我在这个例子中遇到了很多麻烦 for i 2 i lt n i i i do something 教授说这是 O sqrt N 但我不确定我是否相信 毕竟 如果 N 16 它只运行 2 次 而不是 4 次 对吧
  • 在升级之前如何查看 npm 包的发行说明?

    npm 注册表是否以标准化方式公开发行说明 我在以下位置看到过发行说明 自述文件 md 在 GitHub 上作为标记版本 没有描述 在 GitHub 上作为带有描述的标记版本 虽然 SemVer 至少让我知道是否有重大更改 但如果能够查看软
  • Magento db连接参数不会改变,疯狂缓存?

    我已将整个 www 目录从 Web 服务器复制到我的本地工作站 我正在尝试让 Magento 连接到本地数据库 是的 我更改了 magento app etc local xml 文件中的连接字符串值 我已经验证了大约一百次 它已经被改变了
  • C++:使用显式指定引用类型作为类型参数的模板函数

    我正在玩 C 模板类型推导并成功编译了这个小程序 template
  • Actionscript 3 克隆影片剪辑

    我们如何克隆 实例名称 的副本 多谢你们 test close是我在画布上绘制的实例名称 var cloneMe MovieClip new MovieClip cloneMe graphics copyFrom test clone gr
  • Windows Phone 8 - 流式传输 Podcast MP3 文件

    我正在创建一个应用程序 该应用程序读取单个播客提要 该应用程序独有 并在LongListSelector 我可以通过解析 RSS 文件来获取每集的 MP3 URI 我想添加这样的功能 当用户点击列表中的某个项目时 URI 会传递到音频流媒体
  • 可扩展列表视图 setOnChildClickListener 不起作用

    我正在使用可扩展的列表视图 我在onceate方法中给出了setOnChildClickListener 但 setOnChildClickListener 不起作用 我正在寻找解决方案 但我找不到任何解决方案 这里给出我所做的 publi
  • 如何使用 jQuery 防止双击?

    我有一个这样的按钮
  • 通过google BigQuery将unsigned int转换为signed int

    我尝试在 google BigQuery api 上运行查询并得到如下异常 函数 IF 中的参数类型不匹配 distinctPlayers 的类型为 TYPE UINT64 0 的类型为 TYPE INT32 查询太大 所以我只写了失败的部
  • 正则表达式中的否定

    我想在 JavaScript 中使用正则表达式进行表单输入验证 这些是一个字符串 不应包含 或我提到的任何特定字符集 如果字符串不包含这些字符 则测试应该通过 那么我如何在正则表达式中指定没有 char Example stringX vi
  • 如何获取字符串中的字符数

    Go中如何获取字符串的字符数 例如 如果我有一个字符串 hello 该方法应该返回5 我看到了len str 返回字节数and not字符数所以len 返回 2 而不是 1 因为 在 UTF 8 中使用两个字节进行编码 你可以试试RuneC