[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

下面的代码,可以把一段字符串中的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

评分人数

    • idwma: 学会了感谢分享技术 + 1
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

回复 10# 5i365


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

TOP

回复 9# for_flr


   [char][int](0x) 大概的意思能明白, 就是把括号内的16进制转成整数,再转成char字符, 但是为啥转成char字符后, 汉字就出来了呢?
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 9# for_flr


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




本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

学习了,powershell果然很power!
这个语句运行过程很类似下面这个
  1. [regex]::matches($uni_s,'\\u(.{4})')|%{[char][int]($_.value.replace('\u','0x'))}
复制代码
param关键字是语句块中定义参数,语句块由大括号引起来,函数其实就是指定了名字的语句块。
[char][int]等多个类型名一起用是常见技巧。

TOP

回复 7# 5i365

不用类只用-replace来实现好想法,但是不会呀
    期待分享

TOP

本帖最后由 5i365 于 2022-3-30 06:50 编辑

回复 5# idwma


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

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


还是说这里用 [regex]::Replace 更恰到好处?
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

回复 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') })
复制代码
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

  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

评分人数

    • 5i365: 技术牛X, 乐于分享技术 + 1

TOP

换一种方式,转 \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"));
复制代码
破语言,不值一提。

TOP

回复 2# 523066680


   感谢大侠指导, 看不出来您用的什么脚本语言
感觉上面的PS脚本可能还可以再精简些
本人所发所有贴子或代码, 诸大侠若认为有改进之处,请不吝赐教,感激不尽!

TOP

介么复杂的吗
  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

评分人数

    • 5i365: 技术牛X, 乐于分享技术 + 1
    • idwma: 学会了感谢分享技术 + 1

TOP

返回列表