Board logo

标题: [其他] CURL 回显UTF-8不需要转码读取的怪招! [打印本页]

作者: jiavip    时间: 6 天前 06:00     标题: CURL 回显UTF-8不需要转码读取的怪招!

前天吧!在
http://www.bathome.net/thread-70437-1-1.html

贴里看到有人求助!随便上去答了几个查错的经验只谈!
虽然后来帖主没回复是怎么解决的!但后来看到他挂上[以解决]也就没在意了。
今天无聊回去翻看了一下他的贴,觉得奇怪!
明明在 CURL CIP.CC 的命令已经有地址了!
为什么那脚本还要写上一句
  1. for /f "delims=: tokens=2" %%l in ('curl -s ipinfo.io^|findstr ""region""') do set ad=%%l&echo 所在地区:%%l
复制代码
来获取地址!而且获取的还是拼音,也没有标示“运营商”!
后来我就试着把那获取IP命令改成获取地址和运营商!
发现那 CURL CIP.CC 回显的是 UTF-8 编码,!
如果批处理是 ANSI 编码则无法 | FIND "地址"
如果把批处理保存为 UTF-8 则不能兼顾上下其他命令或显示!
于是乎 我想到了编码转换!常规办法是~~~
把回显输出到本文,得到的是 UTF-8 编码的本文!
再把本文转码成 ANSI 本文!
再进行读取 ,获得中文地址和中文运营商!
获取命令和转码的批处理已经写好了!但后来觉得转码有点繁琐!
试过几次改写和精简但依然还是面对转码问题!
后来我想到一个怪招,把读取到的所有内容扔到注册表里,再从注册表读取!那就实现了无过渡转码了!哈哈,,,,
脚本已经写好,,贴出来,大家一起参考,研究,讨论,。。。
  1. @Echo off & Color 72 & MODE con: COLS=30 LINES=4 & Title 获取 外网IP ,归属,运营商!
  2. Chcp 65001>Nul
  3. For /f "delims=" %%i in ('curl -s cip.cc') do (call,Set cip=%%cip%%@%%i)
  4. Reg ADD HKLM\Software\jia\dizhi /v dizhi /t REG_SZ /d "%cip%" /f
  5. Chcp 936>Nul
  6. For /f "tokens=2,3,4 delims=@" %%i in ('"REG QUERY HKEY_LOCAL_MACHINE\SOFTWARE\jia\dizhi"') do (Set ip=%%i&Set 地址=%%j&Set 运营商=%%k )
  7. Rer DELETE HKLM\Software\jia /f
  8. Set ip=%ip: =%
  9. Set 地址=%地址: =%
  10. Set 运营商=%运营商: =%
  11. cls
  12. Echo.%ip%
  13. Echo.%地址%
  14. Echo.%运营商%
  15. Pause>Nul&Exit
复制代码

作者: Five66    时间: 6 天前 08:18

没必要
cmd内部用的是unicode
chcp 65001 获取并set完变量之后直接chcp 936回来使用变量就行 , cmd会自动转换
作者: ygqiang    时间: 6 天前 08:33

回复 2# Five66

下面的代码,保存为bat文件,ANSI格式。运行如何显示正常?
  1. @echo off & setlocal enabledelayedexpansion
  2. echo 代码开始
  3. echo 中文字符乱码问题
  4. chcp 65001 > nul
  5. echo 批处理就支持utf-8了,type命令啥的都没问题
  6. REM 获取网卡名称
  7. for /f "delims=" %%a in ('netsh interface show interface^|more +3') do (
  8.     set "str=%%a"
  9.     for /f "tokens=*" %%b in ("!str:~46!") do set interfaceName=%%b
  10. )
  11. echo 网卡名称: "%interfaceName%"
  12. echo 当前使用的网络"%interfaceName%"------已禁用
  13. netsh interface set interface "%interfaceName%" admin=disable
  14. echo.
  15. echo.
  16. echo.
  17. echo.
  18. ping 0 -n 10 >nul 2>nul
  19. echo 当前使用的网络"%interfaceName%"------已启用
  20. netsh interface set interface "%interfaceName%" admin=enable
  21. pause >nul
  22. exit
复制代码

作者: holley    时间: 6 天前 10:15

回复 3# ygqiang


    缺一行 chcp 936
作者: jiavip    时间: 6 天前 14:38

回复 2# Five66


    我试过了,转回来的时候。变量内容是乱码!
作者: aloha20200628    时间: 6 天前 16:00

本帖最后由 aloha20200628 于 2025-1-16 16:28 编辑


用纯批处脚本转换 utf-8 编码至简中编码(gb2312)的方法示例如下,假定 u8.txt 是utf-8编码文件(无头标),gb.txt 是简中编码文件
  1. @echo off &setlocal
  2. chcp 65001>nul
  3. for /f "delims=" %%a in (u8.txt) do set/a "n+=1" &call set "_#%%n%%=%%a"
  4. chcp 936>nul
  5. (for /f "tokens=* delims=_#0123456789=" %%v in ('set _#') do echo,%%v)>"gb.txt"
  6. pause &exit/b
复制代码
反转方法的代码如下
  1. @echo off &setlocal
  2. chcp 936>nul
  3. for /f "delims=" %%a in (gb.txt) do set/a "n+=1" &call set "_#%%n%%=%%a"
  4. chcp 65001>nul
  5. (for /f "tokens=* delims=_#0123456789=" %%v in ('set _#') do echo,%%v)>"u8.txt"
  6. pause &exit/b
复制代码
这种转换方法的限制是》文本行字符量不超过8k,文本文件总行数不超过8k(当然此限亦可用分割方法解决)
curl -s cip.cc 的输出文件是 utf-8 编码,用以上方法转换为简中编码文件,已测试通过...

作者: Five66    时间: 6 天前 16:35

回复 3# ygqiang


   
去掉chcp 65001 > nul
或者
chcp 65001 >nul 前先 chcp 936 >nul ,并将所有中文设置成变量, 以变量方式使用中文
作者: Five66    时间: 6 天前 16:36

回复 5# jiavip


    稍微改了下1楼的代码然后试了下,并没有乱码,win7系统

作者: jiavip    时间: 6 天前 18:26

回复 8# Five66
win10 系统,编写那脚本的时候是在网吧和朋友开黑, 随手写的 脚本编码是 ANSI ,当时得到的是 乱码,步骤和你的是一样的。
现在回到我的win10 本,这样编写又没有乱码了!只能说,可能是网吧系统被过度优化了!或者是网吧系统的某些设置无法自动转换过来。
作者: Five66    时间: 6 天前 19:06

回复 9# jiavip


    估计是网吧系统的区域设置那里 勾上了那个 "UTF-8提供全球语言支持" 导致回显时没有转换成gbk
作者: aloha20200628    时间: 6 天前 23:22

本帖最后由 aloha20200628 于 2025-1-16 23:30 编辑

回复 3# ygqiang

可试用以下两种方案确保3楼代码运行中能正常显示中文数据...
一。代码若坚持用 ansi 编码存盘运行,则须改写其中第五行
     chcp 65001 > nul 改为 chcp 936 > nul
二。代码第五行若坚持用 65001 码页,则须将代码用 utf-8 编码存盘运行

作者: ygqiang    时间: 5 天前 11:16

回复 11# aloha20200628


    谢谢,有没有智能判断的通用代码,这2种情况都能正确显示?
作者: aloha20200628    时间: 5 天前 13:35

回复 12# ygqiang

只要字面量数据仅包含 ascii 字符 》批处脚本中用 936 码页或 65001 码页,随便;批处脚本用 ansi 编码或用 utf-8 编码存盘,随便;但如果字面量数据包含了中文字符,就须确保代码中采用的码页与脚本存盘采用的编码是一致的,936 码页对应简中(ansi 或 gb2312)编码的脚本文件,65001 码页对应 utf-8 编码的脚本文件。cmd 的游戏规则就是如此,据此推断出的玩法也就一目了然了...

作者: ygqiang    时间: 5 天前 15:31

回复 13# aloha20200628


  bat  代码,固定使用ansi格式保存到文件




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