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


    我这边貌似没有问题,不过中文排序可能就不好用

TOP

sort的编码转换确实有问题,使用chcp 65001后将结果重定向到控制台可以正确显示,但有一些典型(没有显著编码特征)没有正确转码:比如“联通”“嘉峪关”等等;将结果重定向到文件无法正确显示,使用sort 1.txt | find /v "" 转码一下可以正确显示但也有前面的问题。

/L[OCALE] locale 微软帮助已经说得很清楚了,它默认按照本地语言环境进行自然语言排序和比较,要改的只能用locale C,C是按字符编码排序的,是唯一的。不同的语言环境的排序、日期、货币格式等都有一些不同,比如中文的zh_CN.GB2312给中文排序会按拼音排序,一些拉丁文的希腊字母会排在英文字母前面,一些欧洲文字不区分变体,等等。
说到拼音排序,其实前面提到的本地语言环境就已经规定了排序方式,是中文系统就是按拼音排序(文件资源管理器就是这样的),可以直接调用api,使用strCmpLogicalW函数,比如:
  1. Add-Type @"
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Runtime.InteropServices;
  5. public static class Localsort
  6. {
  7.     [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
  8.     public static extern int StrCmpLogicalW(string p1, string p2);
  9.     public static string[] Sort(string[] s)
  10.     {
  11.         Array.Sort(s, StrCmpLogicalW);
  12.         return s;
  13.     }
  14. }
  15. "@
  16. $inputFile = "origin.txt"
  17. $outputFile = "sorted.txt"
  18. $lines = [IO.File]::ReadAllLines($inputFile)
  19. $sortedLines = [Localsort]::Sort($lines)
  20. [IO.File]::WriteAllLines($outputFile, $sortedLines, [Text.Encoding]::UTF8)
复制代码

TOP

sort的/L参数大概是排序顺序,影响排出来的顺序,无效或许还没实现,只能是C?

chcp 65001时,要在cmd窗口里显示得设置字体,输出到文件可以不用设置字体,只是sortt输出时不知咋的utf8字符的某些字节码被转成问号(?),会导致某些部分乱码,而输出文件的编码是无bom的utf8,文本编辑器打开这个文件时很大概率会将编码识别为ansi(简体中文下是gbk)

type是好像单纯以换行符做为分割点的来输出,输出的内容由cmd根据当前代码也来解读(例如936代码页时按gbk解读,65001代码页时按utf8解读)

finstr貌似不支持非英文的utf8(例如中文),因为asni英文和utf8英文是一样的

TOP

回复 3# ppll2030


    对sort而言,感觉仅仅写chnp=65001是肯定不行的

TOP

回复 3# ppll2030

刚又试了一下,还是没用。

TOP

回复 1# killer3k


    chcp 65001是可以正常显示的,cmd窗口属性,换个字体就可以了。

TOP

我也遇到同样的问题,sort后输出的文件中的中文都变成乱码,测试了很多方法都没有成功。chnp 65001没有任何用处。看看有没有大佬们给与指导

TOP

返回列表