如何用.NET GetBytes方法仅转换有效字节且不生成问号?
解决方案
要实现仅保留Windows-1252编码支持的字符、直接过滤无效字符而非替换为问号的需求,关键是自定义编码的回退策略,将无法编码的字符直接忽略,而非使用默认的问号替换。
具体实现代码
# 创建自定义Windows-1252编码实例,设置无效字符回退为空字符串(即直接过滤) $win1252Encoding = [System.Text.Encoding]::GetEncoding( 1252, [System.Text.EncoderReplacementFallback]::new(""), # 编码时忽略无效字符 [System.Text.DecoderReplacementFallback]::new("") # 解码时忽略无效字节(可选) ) # 示例字符串 $originalString = "Helloäöü?→" # 执行编码+解码流程 $bytes = $win1252Encoding.GetBytes($originalString) $processedString = $win1252Encoding.GetString($bytes) # 输出结果:Helloäöü? $processedString
原理说明
- 默认的Windows-1252编码遇到无法映射的Unicode字符时,会使用
?作为替换字符(由EncoderReplacementFallback的默认行为决定)。 - 通过创建空字符串的
EncoderReplacementFallback实例,告诉编码器遇到无效字符时直接跳过,不生成任何字节,最终解码后自然不会出现问号。
内容的提问来源于stack exchange,提问作者maribox
相关产品推荐
相关产品推荐

