Golang Go语言 utf8 字符显示问题求助(rune 显示宽度)

发布于 1周前 作者 ionicwang 来自 Go语言

Golang Go语言 utf8 字符显示问题求助(rune 显示宽度)

请教各位大神有什么办法能能获取到一个 utf8 字符在终端中显示的宽度,通俗的说是占位

目前在使用一个终端开源库,发现在方向键移动光标的时候会出现问题;大致原因是因为其捕获到 方向键移动后,始终向终端 print 一个 '\b' 字符,而实际上终端中汉字占位为 2 个长度,这样导致光标卡到了汉字的一半位置,导致后续移动错位;相关帖子这里也有讨论 https://golangtc.com/t/53f84f0e320b520f4b0000f4

由于 utf8 变长,所以目前能想到比较 low 的办法就是判断 字符是否为中文,反正我自己用肯定是等宽字体,确认是中文字符直接 print 2 个 '\b' 就行,但是感觉.....真的 low


更多关于Golang Go语言 utf8 字符显示问题求助(rune 显示宽度)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

更多关于Golang Go语言 utf8 字符显示问题求助(rune 显示宽度)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


#1 万分感谢,我明天看下他的原理

百度搜索半天 都没找到答案, 还是 V2EX 威武.

中英文混合 unicode 字符串 显示宽度问题, 用 golang 自己的 %-10v 是无法对齐的,只能按照字符个数对齐,但是显示宽度不一致,有 1 有 2 ,真的好气, 强迫症啊, 必须用程序 合理的解决.

golang 的 unicode 包 居然也无法判断是否是 ascii ,是否是中文 等符号. unicode 包啊 …

在Go语言中处理UTF-8字符显示问题时,特别是涉及到rune类型字符的显示宽度,需要理解Unicode字符的宽度属性。UTF-8编码可以表示多种Unicode字符,而这些字符的宽度并不统一,有全角(宽字符)和半角(窄字符)之分。

在Go中,rune类型实际上是int32的别名,用于表示单个Unicode码点。当你读取或处理UTF-8编码的字符串时,可以使用range循环来迭代字符串中的每个rune,这样可以正确处理多字节的UTF-8字符。

对于显示宽度问题,Go标准库并没有直接提供函数来判断一个rune的显示宽度。不过,你可以使用第三方库,如golang.org/x/text/width,该库提供了Width.StringWidth方法来判断字符串的显示宽度。

示例代码如下:

package main

import (
    "fmt"
    "golang.org/x/text/width"
)

func main() {
    str := "Hello, 世界"
    fmt.Printf("String width: %d\n", width.StringWidth(str))
    for _, r := range str {
        fmt.Printf("Rune: %c, Width: %d\n", r, width.RuneWidth(r))
    }
}

这段代码会输出字符串str的总显示宽度以及每个rune的显示宽度。注意,全角字符(如汉字)的显示宽度通常为2,而半角字符(如ASCII字符)的显示宽度为1。通过这种方式,你可以更好地处理UTF-8字符的显示问题。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!