golang零宽度字符检测与移除插件库go-zero-width的使用

golang零宽度字符检测与移除插件库go-zero-width的使用

简介

go-zero-width 是一个用于检测和移除零宽度字符的 Go 语言库。该库灵感来源于一篇关于零宽度字符的文章。

安装

go get github.com/trubitsyn/go-zero-width

使用示例

package main

import (
	"github.com/trubitsyn/go-zero-width"
	"fmt"
)

func main() {
	// 字符串中包含零宽度空格(在"c"和"d"之间)
	login := "abc​def"
	
	// 移除零宽度字符
	clean := zerowidth.RemoveZeroWidthCharacters(login)
	
	// 打印原始字符串的十六进制表示(包含零宽度字符 e2 80 8b)
	fmt.Printf("% x\n", login) // 输出: 61 62 63 e2 80 8b 64 65 66
	
	// 打印清理后的字符串的十六进制表示
	fmt.Printf("% x\n", clean) // 输出: 61 62 63 64 65 66
}

支持的零宽度字符

  • 零宽度空格 (U+200B)
  • 零宽度非断空格 (U+FEFF)
  • 零宽度连接符 (U+200D)
  • 零宽度非连接符 (U+200C)

测试

go get -t github.com/trubitsyn/go-zero-width
go test github.com/trubitsyn/go-zero-width

许可证

Copyright 2018 Nikola Trubitsyn

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

更多关于golang零宽度字符检测与移除插件库go-zero-width的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang零宽度字符检测与移除插件库go-zero-width的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Go-Zero-Width: Golang零宽度字符检测与移除库

零宽度字符(Zero-Width Characters)是一类不可见的Unicode字符,它们不占用任何显示空间但可能包含在文本中,有时会被用于隐蔽通信或恶意目的。go-zero-width是一个专门用于检测和移除这些字符的Golang库。

安装

go get github.com/trubitsyn/go-zero-width

主要功能

  1. 检测文本中是否包含零宽度字符
  2. 移除文本中的所有零宽度字符
  3. 获取文本中包含的所有零宽度字符列表

使用示例

1. 基本使用

package main

import (
	"fmt"
	zw "github.com/trubitsyn/go-zero-width"
)

func main() {
	// 包含零宽度字符的文本
	text := "Hello\u200BWorld\u200C\u200D"

	// 检测是否包含零宽度字符
	if zw.ContainsZeroWidthCharacters(text) {
		fmt.Println("文本包含零宽度字符")
		
		// 获取所有零宽度字符
		chars := zw.GetZeroWidthCharacters(text)
		fmt.Printf("包含的零宽度字符: %U\n", chars) // 输出: [U+200B U+200C U+200D]
		
		// 移除零宽度字符
		cleanText := zw.RemoveZeroWidthCharacters(text)
		fmt.Println("清理后的文本:", cleanText) // 输出: HelloWorld
	} else {
		fmt.Println("文本不包含零宽度字符")
	}
}

2. 自定义零宽度字符集

func main() {
	text := "Secret\u2060Message\u2062"
	
	// 自定义要检测的零宽度字符集
	customChars := []rune{'\u2060', '\u2061', '\u2062'}
	
	if zw.ContainsCustomZeroWidthCharacters(text, customChars) {
		fmt.Println("文本包含自定义零宽度字符")
		
		// 移除自定义零宽度字符
		cleanText := zw.RemoveCustomZeroWidthCharacters(text, customChars)
		fmt.Println("清理后的文本:", cleanText) // 输出: SecretMessage
	}
}

3. 高级用法 - 保留特定零宽度字符

func main() {
	text := "Keep\u200Bthis\u200Cbut\u200Dremove\u2060others"
	
	// 定义要保留的零宽度字符
	keepChars := []rune{'\u200B', '\u200C'}
	
	// 获取所有零宽度字符
	allZWChars := zw.GetZeroWidthCharacters(text)
	
	// 计算需要移除的字符 = 所有零宽字符 - 要保留的字符
	removeChars := make([]rune, 0)
	for _, char := range allZWChars {
		keep := false
		for _, k := range keepChars {
			if char == k {
				keep = true
				break
			}
		}
		if !keep {
			removeChars = append(removeChars, char)
		}
	}
	
	// 移除不需要的零宽度字符
	result := zw.RemoveCustomZeroWidthCharacters(text, removeChars)
	fmt.Println(result) // 输出: Keep\u200Bthis\u200Cbutremoveothers
}

支持的零宽度字符

go-zero-width默认检测以下零宽度字符:

  • U+200B (零宽度空格)
  • U+200C (零宽度非连接符)
  • U+200D (零宽度连接符)
  • U+2060 (词连接符)
  • U+FEFF (零宽度无断空格)
  • U+FFF9-FFFB (替换字符)
  • 其他常见的零宽度控制字符

实际应用场景

  1. 安全检测:检查用户输入中是否包含隐蔽的零宽度字符
  2. 数据清洗:在文本处理前移除不可见字符
  3. 日志分析:检测日志中可能存在的隐蔽信息
  4. 密码学应用:处理使用零宽度字符的隐写术

性能考虑

对于大量文本处理,建议:

// 预编译正则表达式可以提高重复处理的性能
var zeroWidthRegex = regexp.MustCompile(`[\u200B-\u200D\u2060\uFEFF]`)

func fastRemove(text string) string {
    return zeroWidthRegex.ReplaceAllString(text, "")
}

go-zero-width是一个轻量级库,适合集成到各种Golang应用中,帮助开发者处理零宽度字符相关的问题。

回到顶部