sort的编码转换确实有问题,使用chcp 65001后将结果重定向到控制台可以正确显示,但有一些典型(没有显著编码特征)没有正确转码:比如“联通”“嘉峪关”等等;将结果重定向到文件无法正确显示,使用sort 1.txt | find /v "" 转码一下可以正确显示但也有前面的问题。
/L[OCALE] locale 微软帮助已经说得很清楚了,它默认按照本地语言环境进行自然语言排序和比较,要改的只能用locale C,C是按字符编码排序的,是唯一的。不同的语言环境的排序、日期、货币格式等都有一些不同,比如中文的zh_CN.GB2312给中文排序会按拼音排序,一些拉丁文的希腊字母会排在英文字母前面,一些欧洲文字不区分变体,等等。
说到拼音排序,其实前面提到的本地语言环境就已经规定了排序方式,是中文系统就是按拼音排序(文件资源管理器就是这样的),可以直接调用api,使用strCmpLogicalW函数,比如: | Add-Type @" | | using System; | | using System.Collections.Generic; | | using System.Runtime.InteropServices; | | public static class Localsort | | { | | [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)] | | public static extern int StrCmpLogicalW(string p1, string p2); | | | | public static string[] Sort(string[] s) | | { | | Array.Sort(s, StrCmpLogicalW); | | return s; | | } | | } | | "@ | | $inputFile = "origin.txt" | | $outputFile = "sorted.txt" | | | | $lines = [IO.File]::ReadAllLines($inputFile) | | $sortedLines = [Localsort]::Sort($lines) | | [IO.File]::WriteAllLines($outputFile, $sortedLines, [Text.Encoding]::UTF8)COPY |
|