Board logo

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

作者: 5i365    时间: 2022-3-29 17:28     标题: 求指导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)
作者: 523066680    时间: 2022-3-29 18:38

介么复杂的吗
  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);
复制代码
嗨!我是中国人

作者: 5i365    时间: 2022-3-29 18:52

回复 2# 523066680


   感谢大侠指导, 看不出来您用的什么脚本语言
感觉上面的PS脚本可能还可以再精简些
作者: 523066680    时间: 2022-3-29 19:00

换一种方式,转 \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"));
复制代码
破语言,不值一提。
作者: idwma    时间: 2022-3-29 20:19

  1. [regex]::Replace($Uni_s, '\\u.{4}', {$args[0];"`n"})
  2. [regex]::Replace($Uni_s, '\\u.{4}', {[char][int]($args[0] -replace '\\u','0x')})
复制代码

作者: 5i365    时间: 2022-3-30 06:43

回复 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') })
复制代码

作者: 5i365    时间: 2022-3-30 06:49

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

回复 5# idwma


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

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


还是说这里用 [regex]::Replace 更恰到好处?
作者: idwma    时间: 2022-3-30 15:29

回复 7# 5i365

不用类只用-replace来实现好想法,但是不会呀
    期待分享
作者: for_flr    时间: 2022-3-30 17:16

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

回复 9# for_flr


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





作者: 5i365    时间: 2022-3-30 18:58

回复 9# for_flr


   [char][int](0x) 大概的意思能明白, 就是把括号内的16进制转成整数,再转成char字符, 但是为啥转成char字符后, 汉字就出来了呢?
作者: for_flr    时间: 2022-3-30 21:18

回复 10# 5i365


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




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2