Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 如何获取字符串中的字符数_String_Go_Character_String Length - Fatal编程技术网

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

String 如何获取字符串中的字符数,string,go,character,string-length,String,Go,Character,String Length,如何获取Go中字符串的字符数 例如,如果我有一个字符串“hello”,则该方法应返回5。我看到len(str)返回字节数而不是字符数,因此len(“£”)返回2而不是1,因为在UTF-8中,£用两个字节编码。您可以从utf8包中尝试 返回p中的符文数 如中所示,“世界”的长度可能是6(如果用中文写:世界"), 但它的符文数是2: 主程序包 输入“fmt” 导入“unicode/utf8” func main(){ fmt.Println(“你好,世界“,len(”世界“”,utf8。运行计算安装

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

例如,如果我有一个字符串
“hello”
,则该方法应返回
5
。我看到
len(str)
返回字节数而不是字符数,因此
len(“£”)
返回2而不是1,因为在UTF-8中,£用两个字节编码。

您可以从utf8包中尝试

返回p中的符文数

如中所示,“世界”的长度可能是6(如果用中文写:世界"), 但它的符文数是2:

主程序包
输入“fmt”
导入“unicode/utf8”
func main(){
fmt.Println(“你好,世界“,len(”世界“”,utf8。运行计算安装(“”)世界"))
}
加上:

实际上,你只需键入强制类型,就可以对符文执行
len()

len([]符文(“世界)
将在Go 1.3中打印
2


随着(2018年5月,对于Go 1.11),
len([]符文(字符串))
现在得到了优化

编译器自动检测
len([]符文(字符串))
模式,并将其替换为for r:=range s调用

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

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%

指向博客帖子“”

什么是角色? 如中所述,字符可以跨越多个符文
例如,“
e
”和'◌́◌́'(锐“\u0301”)可以组合成“é”(NFD中的“
e\u0301
”。这两个符文一起是一个字符

字符的定义可能因应用程序而异。
对于,我们将其定义为:

  • 一系列符文,从一个起始符开始
  • 不与任何其他符文向后修改或组合的符文
  • 然后是可能为空的非起始符序列,即符文(通常是重音)
标准化算法一次处理一个字符

使用该软件包及其附件,“字符”的实际数量为:

主程序包
输入“fmt”
导入“golang.org/x/text/unicode/norm”
func main(){
国际热核聚变实验堆
ia.InitString(norm.NFKD,“école”)
nc:=0
对于!ia.Done(){
nc=nc+1
ia.Next()
}
fmt.Printf(“字符数:%d\n”,nc)
}
这里,它使用NFKD“兼容性分解”


's指出,是可靠确定某些重要文本元素(用户感知的字符、单词和句子)之间默认边界的唯一方法

为此,您需要一个像这样的外部库,它可以进行Unicode文本分割

这将实际计算“集群”,其中多个代码点可以组合成一个用户感知的字符

package uniseg
进口(
“fmt”
“github.com/rivo/uniseg”
)
func main(){

gr:=uniseg.NewGraphemes(在很大程度上取决于您对“字符”的定义。如果“符文等于字符”,则适合您的任务(通常不是)那么VonC的答案对你来说是完美的。否则,应该注意的是,很少有情况下Unicode字符串中的符文数是一个有趣的值。即使在这些情况下,如果可能的话,最好在“遍历”时推断计数处理符文时使用字符串,以避免UTF-8解码工作量加倍。

如果需要考虑字形集群,请使用regexp或unicode模块。计算代码点(符文)的数量或者validaiton也需要字节,因为grapheme集群的长度是无限的。如果要消除非常长的序列,请检查序列是否符合


通过将字符串转换为[]符文作为
len([]符文(您的_字符串))
,可以获得没有任何包的符文计数:

字节计数30 16

符文计数16


我试图使标准化的速度加快一点:

    en, _ = glyphSmart(data)

    func glyphSmart(text string) (int, int) {
        gc := 0
        dummy := 0
        for ind, _ := range text {
            gc++
            dummy = ind
        }
        dummy = 0
        return gc, dummy
    }

我要指出的是,到目前为止提供的答案中没有一个能提供您预期的字符数,特别是当您使用表情符号(还有一些语言,如泰语、韩语或阿拉伯语)时。将输出以下内容:


fmt.Println(utf8.runecounnstring(“获取字符串长度有几种方法:

package main

import (
    "bytes"
    "fmt"
    "strings"
    "unicode/utf8"
)

func main() {
    b := "这是个测试"
    len1 := len([]rune(b))
    len2 := bytes.Count([]byte(b), nil) -1
    len3 := strings.Count(b, "") - 1
    len4 := utf8.RuneCountInString(b)
    fmt.Println(len1)
    fmt.Println(len2)
    fmt.Println(len3)
    fmt.Println(len4)

}


你可以在这个字符串反转函数中看到它的作用,它只告诉你符文的数量,而不是符文的数量。许多符文都是由多个符文组成的。实际上,你只需输入len([]符文(“世界“”)将打印2。在Go 1.3的leats中,不知道它已经有多长时间了。@VonC:事实上,一个字符(字形的口语术语)偶尔可以跨越多个符文,所以这个答案是,用精确的技术术语来说,错了。你需要的是字素/字素簇计数,而不是符文计数。例如,“e”和“e”◌́’(急性“\u0301”)可以组合成“é”(NFD中的“e\u0301”),但人类会(正确地)组合成“é”将é;视为一个字符。显然,这在泰卢古语中会有所不同。但也可能是法语,这取决于您使用的键盘/语言环境。@JustinJohnson同意。我已经编辑了答案,以更好地引用我之前投票过的Oliver的答案。什么时候您不会将符文视为字符?Go规范将符文定义为Unicode码点:另外,为了避免解码工作量加倍,我只需做一个[]符文(str),然后在完成后转换回字符串。我认为这比在遍历字符串时跟踪代码点要容易。@ThomasKappler:when?嗯,当符文不是字符时,通常不是。只有一些符文等于字符,而不是所有字符
    en, _ = glyphSmart(data)

    func glyphSmart(text string) (int, int) {
        gc := 0
        dummy := 0
        for ind, _ := range text {
            gc++
            dummy = ind
        }
        dummy = 0
        return gc, dummy
    }
package main

import (
    "bytes"
    "fmt"
    "strings"
    "unicode/utf8"
)

func main() {
    b := "这是个测试"
    len1 := len([]rune(b))
    len2 := bytes.Count([]byte(b), nil) -1
    len3 := strings.Count(b, "") - 1
    len4 := utf8.RuneCountInString(b)
    fmt.Println(len1)
    fmt.Println(len2)
    fmt.Println(len3)
    fmt.Println(len4)

}