tl;有没有办法将哈希表中存储的西里尔字母转换成UTF-16?

我需要导入文件,将其解析为idvalue,然后将其转换为.json,现在我正在努力寻找将value转换为utf代码的方法.

是的,这样做是必要的

西里尔语.txt:

1 кириллица

酸碱度:

clear-host
foreach ($line in (Get-Content C:\Users\users\Downloads\cyrillic.txt)){
    $nline = $line.Split(' ', 2)
    $properties = @{
        'id'= $nline[0] #stores "1" from file
        'value'=$nline[1] #stores "кириллица" from file
    }
    $temp+=New-Object PSObject -Property $properties
}
$temp | ConvertTo-Json | Out-File "C:\Users\user\Downloads\data.json"

输出:

[
    {
        "id":  "1",
        "value":  "кириллица"
    },
]

需要:

[
    {
        "id":  "1",
        "value":  "\u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430"
    },
]

在这一点上,作为PH值的新手,我甚至不知道如何正确地搜索它

推荐答案

基于Jeroen Mostert的有益 comments ,假设输入文件不包含NUL个字符(通常对于text个文件来说,这是一个安全的假设),以下内容非常有效:

# Sample value pair; loop over file lines omitted for brevity.
$nline = '1 кириллица'.Split(' ', 2)

$properties = [ordered] @{
  id = $nline[0]
  # Insert aux. NUL characters before the 4-digit hex representations of each
  # code unit, to be removed later.
  value = -join ([uint16[]] [char[]] $nline[1]).ForEach({ "`0{0:x4}" -f $_ })
}

# Convert to JSON, then remove the escaped representations of the aux. NUL chars.,
# resulting in proper JSON escape sequences.
# Note: ... | Out-File ... omitted.
(ConvertTo-Json @($properties)) -replace '\\u0000', '\u'

输出(管道至ConvertFrom-Json,以验证其是否有效):

[
  {
    "id": "1",
    "value": "\u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430"
  }
]

说明:

  • [uint16[]] [char[]] $nline[1]$nline[1]中存储的[char]个字符串实例转换为底层UTF-16代码单元(a.NET [char]是一个编码Unicode码点的无符号16位整数).

    • 请注意,这甚至适用于代码点在0xFFFF以上的Unicode字符,也就是说,这些字符太大,无法放入[uint16].在所谓的BMP(基本多语言平面)之外的这些字符,例如????,被简单地表示为pairs个UTF-16代码单元,即所谓的surrogate pairs,JSON处理器应该识别它(ConvertFrom-Json).
    • 然而,在Windows个这样的角色上.可能不正确,具体取决于控制台窗口的字体.最安全的 Select 是使用Windows Terminal,可用in the Microsoft Store
  • .ForEach() array method的调用处理每个生成的代码单元:

    • "`0{0:x4}" -f $_使用expandable string创建一个字符串,该字符串以NUL字符("`0")开头,后跟4位十六进制.通过-f创建的手边代码单元的表示(x4),format operator.

      • 我们需要用NUL个字符替换原本应该是ultimately的verbatim \u前缀temporarily,因为在JSON表示中,嵌入字符串值的verbatim \总是doubled,因为\在JSON中充当转义字符.
    • 结果类似于"<NUL>043a",其中ConvertTo-Json个转换如下,因为它必须将每个NUL个字符转义为\u0000:

      "\u0000043a"
      
  • 然后,只需将\u0000(转义为\\u0000,用于基于正则表达式的-replace oeprator)替换为\u,即可将ConvertTo-Json的结果转换为所需的转义序列,例如:

      "\u0000043a" -replace '\\u0000', '\u' # -> "\u043a", i.e. к
    

Json相关问答推荐

最新版本的Deneb在数据溢出时不支持滚动

如何将加权边列表导出到JSON树?

Ansible - 将文件内容添加到字典中

JOLT分裂和数组数据

APIM 生成 JsonArray 到 EventHub

带有 API 测试的 Typescript JSON 模式验证

在这种情况下我如何实现 UnmarshalJSON 并且只为一个接口字段定义特殊行为?

使用 jq 将消息转换为数组

通过一个序列化器更新多个模型数据

当值包含ansible中的字符串时解析json值

从多维数组数据生成json字符串

如何使用 C# 将 JSON 文本转换为对象

将 Objective-C 对象序列化和反序列化为 JSON

使用杰克逊创建一个 json 对象

Json.NET 是否缓存类型的序列化信息?

是否可以将数据写入本地 json 文件,除了Angular 之外什么都没有?

as_json 没有在关联上调用 as_json

Gson 将一组数据对象转换为 json - Android

如何使用 Json.NET 反序列化可以是两种不同数据类型的 JSON 属性

如何对 Javascript 对象进行排序,或将其转换为数组?