我正在将带有我不想要的奇怪符号的字符串转换成拉丁文-1(或者至少是微软对它的理解),然后再转换回字符串.我使用PowerShell,但这只是关于.NET方法:

    $bytes = [System.Text.Encoding]::GetEncoding(1252).GetBytes($String)
    $String = [System.Text.Encoding]::GetEncoding(1252).GetString($bytes)

这项操作非常奇怪,除非奇怪的符号不会被删除,但会创建问号,例如:

"您好?

vbl.成为

"你好?"

我想要的是只转换有效字节,而不创建问号,因此输出将是:

"你好?"

这有可能吗? 我已经找了一会儿,但什么也找不到.ChatGPT对我撒谎,说会有一个"GetValidBytes"方法,但没有...

推荐答案

一种 Select 是使用100-based 101 operation based on 102:

"Helloäöü€?→" -creplace '[^\p{IsBasicLatin}\p{IsLatin-1Supplement}–—€‚‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•˜™š›œžŸ]'

由于您的输入已经是.NET字符串(因此由UTF-16代码单元组成),因此不需要严格地在字节之间进行转换:

  • \p{IsBasicLatin}\p{IsLatin-1Supplement匹配属于ISO-8859-1 Unicode subrange的字符,这与Windows-1252相同,但缺少几个字符.

  • 显式列举的字符(€...)是ISO-8859-1中存在的那些Windows-1252字符not(因此,它们在Unicode中具有与Windows-1252中不同的代码点,即在8位范围之外).

    • (连字符和长连字符)被放置在first处,因此它们不会被误认为描述了range个字符(.NET正则表达式引擎显然允许它们与-互换使用,-是常规的"破折号"(ASCII范围连字符).
    • (单低9引号)是doubled,因为PowerShell允许它与'(单引号)互换使用-另请参阅:this answer汇总了PowerShell中允许的所有此类可互换使用.

通过将所有non匹配的(^)字符替换为(隐含的)empty string,所有非Windows-1252字符实际上都是removed.

一个一般性的警告:

  • 由于在命令中使用了literal个非ASCII范围的字符,请确保PowerShell正确解释脚本文件的字符编码,这特别意味着使用UTF-8文件with BOM来支持Windows PowerShell-请参见this answer.

然而,your to-and-from-bytes encoding approach can be used with a slight adaptation,这是works with any target encoding(不需要列举如上的单个字符):

使用用empty string初始化的System.Text.EncoderReplacementFallback实例可以有效地删除目标编码中无法表示的所有字符.

$string = "Helloäöü€?→"

$encoding = [System.Text.Encoding]::GetEncoding(
  1252,
  # Replace non-Windows-1252 chars. with '' (empty string), i.e. *remove* them.
  [System.Text.EncoderReplacementFallback]::new(''),
  [System.Text.DecoderFallback]::ExceptionFallback # not relevant here
)

$string = $encoding.GetString($encoding.GetBytes($string))

.net相关问答推荐

PowerShell中窗体定时器和系统定时器的统一处理

Powershell机器令牌组

AutoMapper在实体框架查询后不知从哪里带来数据

使用 MassTransit、.NET Core 和 RabbitMQ 的设计挑战

在 C# 中生成随机小数

Web API 中基于令牌的身份验证,无需任何用户界面

如何获取控制台应用程序的执行目录

每 X 秒执行一次指定函数

为什么 C# 不允许像 C++ 这样的非成员函数

LINQ:确定两个序列是否包含完全相同的元素

属性应该与其类型同名吗?

是否可以更改 Winforms 组合框以禁用输入?

什么是 Hashtable 的通用版本?

Moq - 不可覆盖的成员不能用于设置/验证表达式

是否可以在 XP 上运行 .NET 4.5 应用程序?

清除文件内容

在 .NET 中,null 的哈希码是否应该始终为零

找不到 System.Windows.Media 命名空间?

通过反射获取公共静态字段的值

如何在我的机器上找到 fuslogvw.exe?