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

返回列表