找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 16952|回复: 11

[问题求助] 求指导PowerShell脚本unicode编码转中文中的代码含义

[复制链接]
发表于 2022-3-29 17:28:18 | 显示全部楼层 |阅读模式
下面的代码,可以把一段字符串中的unicode字符转成中文, 但是看不懂中间那段代码什么含义, 请求大佬指点迷津,添加一下注释, 提前感谢!
具体疑问:
1. 没有Function关键字, 却有param
2. 在一语句前为什么加两个类型 [char][int]
3. $v.Value.replace 这个怎么对象的属性的方法连起来了


$Uni_s = '嗨!\u6211\u662f\u4e2d\u56fd\u4eba'

$match = {

param ($v)

[char][int]($v.Value.replace('\u', '0x'))
}

[regex]::Replace($Uni_s, '\\u[0-9-a-f]{4}', $match)

评分

参与人数 1技术 +1 收起 理由
idwma + 1 学会了感谢分享

查看全部评分

发表于 2022-3-29 18:38:01 | 显示全部楼层
介么复杂的吗

  1. use utf8;
  2. use Encode;
  3. my $str='嗨!\u6211\u662f\u4e2d\u56fd\u4eba';
  4. $str=~s/\\u(.{4})/chr(hex($1))/eg;
  5. print encode('gbk', $str);
复制代码
嗨!我是中国人

评分

参与人数 2技术 +2 收起 理由
5i365 + 1 技术牛X, 乐于分享
idwma + 1 学会了感谢分享

查看全部评分

 楼主| 发表于 2022-3-29 18:52:12 | 显示全部楼层
回复 2# 523066680


   感谢大侠指导, 看不出来您用的什么脚本语言
感觉上面的PS脚本可能还可以再精简些
发表于 2022-3-29 19:00:54 | 显示全部楼层
换一种方式,转 \x{} 再 eval

  1. use utf8;
  2. use Encode;
  3. my $str='嗨!\u6211\u662f\u4e2d\u56fd\u4eba';
  4. $str=~s/\\u(.{4})/\\x\{$1\}/g;
  5. print encode('gbk', eval qq("$str"));
复制代码
破语言,不值一提。
发表于 2022-3-29 20:19:40 | 显示全部楼层
  1. [regex]::Replace($Uni_s, '\\u.{4}', {$args[0];"`n"})
  2. [regex]::Replace($Uni_s, '\\u.{4}', {[char][int]($args[0] -replace '\\u','0x')})
复制代码

评分

参与人数 1技术 +1 收起 理由
5i365 + 1 技术牛X, 乐于分享

查看全部评分

 楼主| 发表于 2022-3-30 06:43:14 | 显示全部楼层
回复 5# idwma

大侠这里用 $args[0] 用的妙, 但还是似懂非懂, 先Mark了, 以后慢慢消化 另外感觉用这个 '\\u[0-9-a-f]{4}' 更严谨一些

  1. $Uni_s = '嗨!\u6211\u662f\u4e2d\u56fd\u4eba'
  2. [regex]::Replace($Uni_s, '\\u[0-9-a-f]{4}', { [char][int]($args[0] -replace '\\u', '0x') })
复制代码
 楼主| 发表于 2022-3-30 06:49:20 | 显示全部楼层
本帖最后由 5i365 于 2022-3-30 06:50 编辑

回复 5# idwma


想请教大侠, 代码中应该是使用了C#的替换函数 [regex]::Replace

不能全程使用PS的替换 -Replace 来搞定吗?


还是说这里用 [regex]::Replace 更恰到好处?
发表于 2022-3-30 15:29:34 | 显示全部楼层
回复 7# 5i365

不用类只用-replace来实现好想法,但是不会呀
    期待分享
发表于 2022-3-30 17:16:05 | 显示全部楼层
学习了,powershell果然很power!
这个语句运行过程很类似下面这个
  1. [regex]::matches($uni_s,'\\u(.{4})')|%{[char][int]($_.value.replace('\u','0x'))}
复制代码
param关键字是语句块中定义参数,语句块由大括号引起来,函数其实就是指定了名字的语句块。
[char][int]等多个类型名一起用是常见技巧。
 楼主| 发表于 2022-3-30 18:54:54 | 显示全部楼层
回复 9# for_flr


    感谢分享, 用管道后, 好理解多了! 但我执行后, 是竖着输出的, 嗨! 没了




 楼主| 发表于 2022-3-30 18:58:39 | 显示全部楼层
回复 9# for_flr


   [char][int](0x) 大概的意思能明白, 就是把括号内的16进制转成整数,再转成char字符, 但是为啥转成char字符后, 汉字就出来了呢?
发表于 2022-3-30 21:18:42 | 显示全部楼层
回复 10# 5i365


    我意思是一楼的语句运行过程和我举例的代码很相似,将正则匹配到的数据调用replace()方法处理之后,再进行替换。
[char]可以返回ascⅡ编码对应的字符,题目中16进制[int]转换后的数字就是那几个汉字的ascⅡ编码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:25 , Processed in 0.023282 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表