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

[其他] 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
复制代码

没必要
cmd内部用的是unicode
chcp 65001 获取并set完变量之后直接chcp 936回来使用变量就行 , cmd会自动转换

TOP

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

TOP

回复 3# ygqiang


    缺一行 chcp 936

TOP

回复 2# Five66


    我试过了,转回来的时候。变量内容是乱码!

TOP

本帖最后由 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 编码,用以上方法转换为简中编码文件,已测试通过...

TOP

回复 3# ygqiang


   
去掉chcp 65001 > nul
或者
chcp 65001 >nul 前先 chcp 936 >nul ,并将所有中文设置成变量, 以变量方式使用中文

TOP

回复 5# jiavip


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

TOP

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

TOP

回复 9# jiavip


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

TOP

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

回复 3# ygqiang

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

TOP

回复 11# aloha20200628


    谢谢,有没有智能判断的通用代码,这2种情况都能正确显示?

TOP

回复 12# ygqiang

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

TOP

回复 13# aloha20200628


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

TOP

返回列表