批处理之家's Archiver

5i365 发表于 2022-3-29 17:28

求指导PowerShell脚本unicode编码转中文中的代码含义

下面的代码,可以把一段字符串中的unicode字符转成中文, 但是看不懂中间那段代码什么含义, 请求大佬指点迷津,添加一下注释, 提前感谢!
具体疑问:
1. 没有Function关键字, 却有[color=#ff00ff][size=12px]param[/size][/color]
[size=12px][color=#000000]2. 在一语句前为什么加两个类型[/color][color=#ff0000] [/color][/size][size=12px][color=#ff0000][char][int][/color][/size]
3. [size=12px][color=#2e8b57]$v.Value.replace [/color][color=#000000]这个怎么对象的属性的方法连起来了[/color][/size]
[size=12px][color=#2e8b57]
[/color][/size]
$Uni_s = '嗨!\u6211\u662f\u4e2d\u56fd\u4eba'

[color=#0000ff]$match = {[/color]

[color=#ff00ff]param[/color][color=#0000ff] ($v)[/color]

[color=#ff0000][char][int][/color][color=#0000ff]([/color][color=#008000]$v.Value.replace[/color][color=#0000ff]('\u', '0x'))[/color]
[color=#0000ff]}[/color]

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

523066680 发表于 2022-3-29 18:38

介么复杂的吗[code]
use utf8;
use Encode;
my $str='嗨!\u6211\u662f\u4e2d\u56fd\u4eba';
$str=~s/\\u(.{4})/chr(hex($1))/eg;
print encode('gbk', $str);[/code][quote]嗨!我是中国人[/quote]

5i365 发表于 2022-3-29 18:52

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=253434&ptid=62151]2#[/url] [i]523066680[/i] [/b]


   感谢大侠指导, 看不出来您用的什么脚本语言 :lol
感觉上面的PS脚本可能还可以再精简些

523066680 发表于 2022-3-29 19:00

换一种方式,转 \x{} 再 eval[code]
use utf8;
use Encode;
my $str='嗨!\u6211\u662f\u4e2d\u56fd\u4eba';
$str=~s/\\u(.{4})/\\x\{$1\}/g;
print encode('gbk', eval qq("$str"));[/code]破语言,不值一提。

idwma 发表于 2022-3-29 20:19

[code][regex]::Replace($Uni_s, '\\u.{4}', {$args[0];"`n"})
[regex]::Replace($Uni_s, '\\u.{4}', {[char][int]($args[0] -replace '\\u','0x')})[/code]

5i365 发表于 2022-3-30 06:43

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=253445&ptid=62151]5#[/url] [i]idwma[/i] [/b]

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

[code]$Uni_s = '嗨!\u6211\u662f\u4e2d\u56fd\u4eba'
[regex]::Replace($Uni_s, '\\u[0-9-a-f]{4}', { [char][int]($args[0] -replace '\\u', '0x') })[/code]

5i365 发表于 2022-3-30 06:49

[i=s] 本帖最后由 5i365 于 2022-3-30 06:50 编辑 [/i]

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=253445&ptid=62151]5#[/url] [i]idwma[/i] [/b]


想请教大侠, 代码中应该是使用了C#的替换函数 [font=Monaco, Consolas, "][size=12px][regex]::Replace [/size][/font][font=Monaco, Consolas, "][size=12px]
[/size][/font]
[font=Monaco, Consolas, "][size=12px]不能全程使用PS的替换 -[/size][/font][font=Monaco, Consolas, "][size=12px]Replace [/size][/font][font=Monaco, Consolas, "][size=12px]来搞定吗? [/size][/font]
[font=Monaco, Consolas, "][size=12px]
[/size][/font]
[font=Monaco, Consolas, "][size=12px]还是说这里用 [/size][/font][font=Monaco, Consolas][size=12px][regex]::Replace 更恰到好处?[/size][/font]

idwma 发表于 2022-3-30 15:29

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=253464&ptid=62151]7#[/url] [i]5i365[/i] [/b]

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

for_flr 发表于 2022-3-30 17:16

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

5i365 发表于 2022-3-30 18:54

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=253503&ptid=62151]9#[/url] [i]for_flr[/i] [/b]


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




5i365 发表于 2022-3-30 18:58

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=253503&ptid=62151]9#[/url] [i]for_flr[/i] [/b]


   [char][int](0x) 大概的意思能明白, 就是把括号内的16进制转成整数,再转成char字符, 但是为啥转成char字符后, 汉字就出来了呢?

for_flr 发表于 2022-3-30 21:18

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=253510&ptid=62151]10#[/url] [i]5i365[/i] [/b]


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

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.