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