Golang中如何用其他语言实现"*"替换(语音语言相关)

Golang中如何用其他语言实现"*"替换(语音语言相关) 你好

我可以在英文中成功进行“*”替换,但在波斯语和中文中遇到了问题。 如何解决这个问题?(由于“[]byte”的原因,例如字符"س"是"[216 179]",它由两个独立的字节组成)

换句话说,如何移除"问号"(�)?

这里是PlayGround链接: https://play.golang.org/p/9Nd7rvatqC9

同时,代码审查:

func main() {

	fmt.Println( replaceAtIndex2("persian ----","س",'*',0))
	fmt.Println( replaceAtIndex2("persian ----","سلام",'*',0))
	
	fmt.Println( replaceAtIndex2("chine +-+-+-","世",'*',0))
	fmt.Println( replaceAtIndex2("chine +-+-+-","世界",'*',0))
	
	fmt.Println( replaceAtIndex2("english  ====","h",'*',0))
	fmt.Println( replaceAtIndex2("english  ====","hello",'*',0))
}

func replaceAtIndex2(typeOfValue string ,str string, replacement rune, index int) string {
	fmt.Println(typeOfValue, len(str))
	fmt.Println(typeOfValue, []byte(str))
	return str[:index] + string(replacement) + str[index+1:]
}

提前感谢。


更多关于Golang中如何用其他语言实现"*"替换(语音语言相关)的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

你需要将字符串转换为 rune 切片([]rune(str)),替换单个 rune,然后再转换回字符串。大致如下:

tmp := []rune(str)
tmp[index] = replacement
return string(tmp)

不过我现在在手机上,无法测试。

更多关于Golang中如何用其他语言实现"*"替换(语音语言相关)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


最后三个参数是反的

这是由于大多数浏览器对混合的从右到左(RTL)和从左到右(LTR)文本方向支持不佳或更差。此外,据我所知,HTML 中甚至不允许在段落内改变书写方向,所以我理解他们在这方面没有做太多工作。

Norbert 的思路无疑是正确的。在 Go 语言中,rune 用于处理 UTF-8 Unicode 码点。当你需要支持非英文字符时,请使用 rune,而不是 byte。

以下是一个让你的程序正常工作的示例:

func main() {
    fmt.Println("hello world")
}

我注释掉了关于波斯语的那两行代码,因为看起来你在那里犯了一些错误。与中文和英文的例子相比,最后三个参数的顺序是反的,并且一个双引号(")的位置也不对。

嗨,诺伯特,

哦,谢谢你的提醒!刚才我把代码从 Go Playground 复制粘贴到本地文件中,在文件里,它显示是正确的,如下所示:

image

所以 Go Playground 存储的代码是正确的,但 Firefox 和 Chrome 浏览器显示不正确(至少在我的区域设置下是这样)。这就解释了为什么 Go Playground 能编译那个“奇怪的代码”而不报错。

在Golang中处理多语言字符替换时,问题确实出在UTF-8编码上。波斯语和中文字符通常需要多个字节表示,而你的代码按字节切片操作会破坏字符结构。以下是正确的解决方案:

package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	fmt.Println(replaceAtIndexUTF8("persian ----", "س", '*', 0))
	fmt.Println(replaceAtIndexUTF8("persian ----", "سلام", '*', 0))
	
	fmt.Println(replaceAtIndexUTF8("chine +-+-+-", "世", '*', 0))
	fmt.Println(replaceAtIndexUTF8("chine +-+-+-", "世界", '*', 0))
	
	fmt.Println(replaceAtIndexUTF8("english ====", "h", '*', 0))
	fmt.Println(replaceAtIndexUTF8("english ====", "hello", '*', 0))
}

func replaceAtIndexUTF8(typeOfValue string, str string, replacement rune, index int) string {
	fmt.Println(typeOfValue, "字符数:", utf8.RuneCountInString(str))
	fmt.Println(typeOfValue, "字节表示:", []byte(str))
	
	// 将字符串转换为rune切片
	runes := []rune(str)
	
	// 检查索引是否有效
	if index < 0 || index >= len(runes) {
		return str
	}
	
	// 替换指定位置的rune
	runes[index] = replacement
	
	// 转换回字符串
	return string(runes)
}

对于更通用的多字符替换,可以使用以下函数:

func replaceRunesAtIndex(str string, replacement string, index int) string {
	runes := []rune(str)
	
	if index < 0 || index >= len(runes) {
		return str
	}
	
	// 将替换字符串也转换为rune切片
	replacementRunes := []rune(replacement)
	
	// 构建结果
	result := make([]rune, 0, len(runes)-1+len(replacementRunes))
	result = append(result, runes[:index]...)
	result = append(result, replacementRunes...)
	result = append(result, runes[index+1:]...)
	
	return string(result)
}

如果需要处理字符串中所有特定字符的替换:

func replaceAllRunes(str string, oldRune, newRune rune) string {
	runes := []rune(str)
	for i := range runes {
		if runes[i] == oldRune {
			runes[i] = newRune
		}
	}
	return string(runes)
}

关键点是使用rune类型而不是byte来处理Unicode字符。rune是int32的别名,可以表示任何UTF-8字符,无论它需要多少字节。utf8.RuneCountInString()函数可以正确计算字符数,而不是字节数。

回到顶部