V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LosLord
V2EX  ›  PowerShell

Windows 简体版的 powershell 和 cmd 终于可以默认 utf-8 了

  •  2
     
  •   LosLord · 2018-05-02 19:39:39 +08:00 · 15289 次点击
    这是一个创建于 2430 天前的主题,其中的信息可能已经有所发展或是发生改变。

    准确的说应该是整个系统默认 utf-8 了,但是我只测试了 powershell,不知道其他程序会不会出问题
    终于可以看不见烦人的乱码了
    感觉 Windows 确实一步步在向开发方向做优化

    65 条回复    2018-05-06 18:05:30 +08:00
    Nitroethane
        1
    Nitroethane  
       2018-05-02 19:43:04 +08:00 via Android
    这不算默认吧,还得自己手动启用
    hljjhb
        2
    hljjhb  
       2018-05-02 19:44:45 +08:00 via Android
    痛点!
    orangeade
        3
    orangeade  
       2018-05-02 19:45:32 +08:00
    还带 BOM 吧
    LosLord
        4
    LosLord  
    OP
       2018-05-02 19:46:05 +08:00
    @Nitroethane "终于可以默认了",以前改起来很烦的
    12101111
        5
    12101111  
       2018-05-02 19:48:39 +08:00 via Android
    这是哪个 build 有的功能
    LosLord
        6
    LosLord  
    OP
       2018-05-02 19:49:02 +08:00
    @12101111 这两天的 1803 就有
    LosLord
        7
    LosLord  
    OP
       2018-05-02 19:50:49 +08:00
    @orangeade BOM 平常对实际影响不大吧,一般都用 IDE
    kikyous
        8
    kikyous  
       2018-05-02 19:52:35 +08:00 via Android
    微软还算发奋图强,只有苹果要死不活的
    Arnie97
        9
    Arnie97  
       2018-05-02 19:54:51 +08:00 via Android
    Unicode 也好,BOM 也好,明明都是我巨硬先实现的,但是,为什么,会变成这样呢…
    Danswerme
        10
    Danswerme  
       2018-05-02 19:55:58 +08:00 via Android
    @Arnie97 白学家统统拉出去枪毙 3 分钟
    dexterzzz
        11
    dexterzzz  
       2018-05-02 20:08:16 +08:00
    去翻看 unicode 标准,标准组织专门来为了反微软而反.
    iwtbauh
        12
    iwtbauh  
       2018-05-02 20:09:04 +08:00   ❤️ 1
    @Arnie97

    UTF-8 是 1992 年发明的,但 Windows 从 NT 3.1 也就是 1993 年才转为使用 UTF-16 ( UCS-2 )
    Unicode 只是字符映射方案,UTF-8,UTF-16,UTF-32 都是 Unicode 的实现

    所以什么时候成了 MS 先实现 Unicode 的了?

    参考: http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt
    iwtbauh
        13
    iwtbauh  
       2018-05-02 20:11:44 +08:00
    总算有点进步,但什么使用 Windows 的系统 API 能原生支持 UTF-8 了这个系统才能让人舒服点编程,Win APi 只能使用 ANSI 字符编码( XxxxA )或者 UTF-16 编码( XxxxW )
    kamen
        14
    kamen  
       2018-05-02 20:12:11 +08:00   ❤️ 1
    windows 都快默认 utf-8 了,美国还在使用英制单位
    PHPer233
        15
    PHPer233  
       2018-05-02 20:15:50 +08:00 via iPhone
    直接存储 Unicode 码值多好,2 个字节就可以搞定,非要用 UTF-8 的 3 个字节。
    iwtbauh
        16
    iwtbauh  
       2018-05-02 20:18:05 +08:00
    @PHPer233 首先两个字节的是 UTF-16 不是 Unicode,而且英文字母 UTF-8 一个字节,UTF-16 是两个字节。另外 UTF-16 还像 CPU 一样有字节序的区别
    Arnie97
        17
    Arnie97  
       2018-05-02 20:18:19 +08:00 via Android
    @iwtbauh 所以你的意思是你是 Plan 9 用户?我只是在开发者常用的几个系统里对比,何况我说的是先,不是最先
    goreliu
        18
    goreliu  
       2018-05-02 20:23:46 +08:00
    在 powershell 里输入中文显示有问题,其他的还好,在 WSL 里运行有中文输出的命令终于不用转编码了。
    iwtbauh
        19
    iwtbauh  
       2018-05-02 20:27:20 +08:00
    @Arnie97 先,不是最先,这种文字游戏有什么意思。你这么说谁不是理解成最先的意思。
    k9982874
        20
    k9982874  
       2018-05-02 20:28:03 +08:00 via iPhone
    cmder 了解一下
    ZenFX
        21
    ZenFX  
       2018-05-02 20:28:39 +08:00
    改了之后我的 IDM 界面上的文字就变成乱码了
    avichen
        22
    avichen  
       2018-05-02 20:37:26 +08:00
    用 powershell 6.0.1
    geelaw
        23
    geelaw  
       2018-05-02 20:43:12 +08:00
    @PHPer233 #15 Unicode 并不能用 2 字节完全表示,有的时候需要用 surrogate pair。

    @iwtbauh #13 看不出来 UTF-8 相比目前的 UCS-2 的好处是啥,大多数需要表示的字符只需要 2 字节(固定长度),这是一个非常难得的特性。我觉得下一步应该是改成 UTF-32。

    最后,如果想要在 PowerShell 里面自动 65001 代码页,可以在 $PROFILE 里面加上一句 chcp 65001
    iwtbauh
        24
    iwtbauh  
       2018-05-02 20:46:46 +08:00 via Android
    @geelaw UTF-8 兼容 ASCII,UTF-16 不兼容 ASCII。UTF-8 没有字节序区别,UTF-16 有字节序的区别。UCS-2 在需要时还是需要扩展到大于 2 字节
    iwtbauh
        25
    iwtbauh  
       2018-05-02 20:49:38 +08:00 via Android
    @iwtbauh #23 当然对于 #13 中的问题并不存在字节序问题。
    abcbuzhiming
        26
    abcbuzhiming  
       2018-05-02 20:50:05 +08:00
    @geelaw 因为体积,计算机世界里最多的字符串仍然是字母和数字,这些 UTF-8 只需要 1 个字节,而 UTF-16 需要两个,体积膨胀呢
    des
        27
    des  
       2018-05-02 20:52:08 +08:00 via Android
    @Arnie97 因为这两份"快乐"不能叠加在一起,手动狗头
    LosLord
        28
    LosLord  
    OP
       2018-05-02 20:52:11 +08:00
    @k9982874
    @avichen
    @geelaw
    不只是命令行,按理说是软件的默认编码都是 UTF-8 了,比如 vs 开发跨平台 C++默认是 GBK,现在默认是 UTF-8,还有 java 的 getBytes()是按照系统的默认编码获取的。改为 UTF-8 能避免很多问题
    iwtbauh
        29
    iwtbauh  
       2018-05-02 20:55:44 +08:00 via Android
    @LosLord 现在版本的 vs 确实好很多了,旧版本 MSVC 对于 UTF-8 字符编码的源码文件支持太糟糕了。

    但是就算源代码文件是 UTF-8,如果我没记错,MSVC 可能还是会把字符编译前转换成 ANSI (中文系统上就是 GBK 系),这就很难受。
    LosLord
        30
    LosLord  
    OP
       2018-05-02 21:04:59 +08:00
    @ZenFX 我记得 IDM 有 UWP 版吧,没用过。

    @iwtbauh 我也是初学 c++,以前用 IDEA 用的熟,现在用 CLion 了,感觉 VS 复杂了不少。
    geelaw
        31
    geelaw  
       2018-05-02 21:07:52 +08:00   ❤️ 1
    @abcbuzhiming #26 不要活在自己的世界里——请问你有真实世界里字符串的统计吗?注意,并不是所有的字母都在 ASCII 范围内,比如希腊字母、希伯来字母和阿拉伯字母,此外,即使是拉丁字母也不全都能用 ASCII 表示;同样,数字除了 0123456789 还有其他的。

    @iwtbauh 但是对于 #13 里的问题,似乎也不需要兼容 ASCII 吧——毕竟你的函数名字变了。

    此外,几乎定长的性质很重要,否则切字符串、数字符个数都是很麻烦的事情。

    @LosLord #28 大多数软件应该选择 internally 使用 UCS-2 (和 Win32 API 交互的时候),并在保存文件的时候明确指定编码,而不是依赖默认编码;所有这样正确设计的软件都不会受 locale 的影响。如果写程序的人假定用户会选择 UTF-8 作为默认代码页(更糟糕的是忘记测试 UTF-8 不是默认代码页的情况)且依赖默认代码页去获得 UTF-8 编码,他们可能会被 surprised ——因为这个世界上大多数人都是使用 non-UTF-8 作为默认代码页的。这个设置是用来兼容那些古早味软件的,which 使用 VerbNounA 系列 API。
    geelaw
        32
    geelaw  
       2018-05-02 21:09:17 +08:00
    @iwtbauh #29 你可以查看 cl /?,里面有介绍 /utf-8 开关,可以把源代码和执行环境都设置为 UTF-8。
    goreliu
        33
    goreliu  
       2018-05-02 21:17:54 +08:00
    看起来这个改动影响比较广泛,比如记事本的 ANSI 也变成 UTF-8 了,还有 .js/.vbs/.ahk 等代码文件的默认编码,可能会产生一些兼容性问题。
    binbinyouliiii
        34
    binbinyouliiii  
       2018-05-02 21:24:19 +08:00
    @goreliu #33 抛弃记事本,使用 notepad++,从你我做起。整个系统编码的变化,影响肯定会不小,谁让微软留下了个中文系统使用 GBK 这个烂摊子呢。
    goreliu
        35
    goreliu  
       2018-05-02 21:26:09 +08:00
    @binbinyouliiii 我自己倒不用记事本,但这样改后,gbk 的文件用记事本打开就变成乱码了,所以还是会产生一些直观的影响。
    qq316107934
        36
    qq316107934  
       2018-05-02 21:28:36 +08:00 via Android
    @iwtbauh 这个工作量可太大了,等下一次内核重构?可是记得微软说过 win10 是最后一个版本的 windows 系统,也不知道微软怎么想。
    Arnie97
        37
    Arnie97  
       2018-05-02 21:38:52 +08:00 via Android
    @qq316107934 因为变成滚动更新发行版了,滑稽
    kokutou
        38
    kokutou  
       2018-05-02 21:42:06 +08:00
    @iwtbauh #24
    utf-8 兼容 ascii 在软件第三方汉化里是个大坑。。。
    多少软件因为这坑,汉字太长放不下。。。
    kokutou
        39
    kokutou  
       2018-05-02 21:43:13 +08:00
    win7 的 bat 不支持 utf-8 怎么办。。。
    强行所有 bat 全部转 powershell 么。。。
    goreliu
        40
    goreliu  
       2018-05-02 21:57:20 +08:00
    @kokutou #39 改成 UTF-8 这个只是可选项,估计除了部分程序员,其他人很少会改吧,不用太考虑兼容性问题。
    geelaw
        41
    geelaw  
       2018-05-02 22:00:08 +08:00
    @kokutou #39 Batch 必须是 OEM 代码页编码的,要获取 OEM 代码页,你可以

    Get-ItemPropertyValue HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage OEMCP
    Narcissu5
        42
    Narcissu5  
       2018-05-02 22:22:13 +08:00
    好像当时使用 GBK 是政府强制的,还好这么多年 GBK 总算凉了
    LosLord
        43
    LosLord  
    OP
       2018-05-02 22:24:59 +08:00
    @Narcissu5 gbk 出现的比 utf-8 早,估计是为了兼容
    LosLord
        44
    LosLord  
    OP
       2018-05-02 22:29:27 +08:00
    @LosLord 说错了,gb2312 比 utf-8 早
    Zzde
        45
    Zzde  
       2018-05-02 22:54:32 +08:00 via iPhone
    cmd 字体舍什么 默认吗
    goreliu
        46
    goreliu  
       2018-05-02 23:01:12 +08:00
    改为后,若干中文界面的小软件乱码了,比较麻烦,不过基本不是太常用的软件。
    thedrwu
        47
    thedrwu  
       2018-05-03 02:04:45 +08:00 via Android
    @iwtbauh 两字节其实是 ucs。utf16 可以更多字节。
    Remember
        48
    Remember  
       2018-05-03 04:55:05 +08:00
    cmd 的默认字体可以改了么?
    abc612008
        49
    abc612008  
       2018-05-03 08:00:23 +08:00 via Android
    勾上之后电脑就不能开机了……
    LosLord
        50
    LosLord  
    OP
       2018-05-03 09:10:33 +08:00
    @goreliu 等哪天微软爸爸在右键属性里加个“使用 GBK 编码打开”就完美了。

    @Remember 网上有很多教程可以改。

    @abc612008 够衰的
    ershiwo
        51
    ershiwo  
       2018-05-03 09:43:38 +08:00
    老 gal 在 utf-8 下肯定是没戏正常运行的了(
    不过还没试 locale emulator 能不能让它们正常跑起来。所以说普通人还真不一定能注意到这个改动。
    BOYPT
        52
    BOYPT  
       2018-05-03 10:05:48 +08:00
    嗯 改了之后 xshell 乱码了,用英文界面吧。
    goreliu
        53
    goreliu  
       2018-05-03 10:09:56 +08:00
    @LosLord @ershiwo 试了下,用 locale emulator 可以,预设配置改成“中文(简体)”,除了一个小软件可能是有 bug 直接崩了,其他的都能正常显示了。
    yksoft1
        54
    yksoft1  
       2018-05-03 10:31:15 +08:00
    @iwtbauh 关键是 CRT 也不支持啊。Linux 下 string.h 里面所有的东西都能支持 utf8,win 可不可能
    goreliu
        55
    goreliu  
       2018-05-03 10:41:02 +08:00
    @iwtbauh @yksoft1 把这个选项改成 UTF-8 后,所有的 XxxxA 函数的字符串编码全变成 UTF-8 了(所以才会产生兼容性问题),如果不考虑在其他电脑运行的话,就相当于系统 API 原生支持 UTF-8 了。但如果需要分发的话,可能比较麻烦,不知道是否可以在自己的软件里单独设置这个选项。
    goreliu
        56
    goreliu  
       2018-05-03 11:14:30 +08:00
    接楼上。文件用 UTF-8 编码,调用 MessageBoxA 函数。

    #include <windows.h>

    int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
    {
    MessageBoxA(0, "Hello 测试 ヘッドセット 한국어", "测试", MB_ICONINFORMATION);
    return 0;
    }

    https://i.loli.net/2018/05/03/5aea7def1e93c.png

    以前的话,因为韩语不在 GBK 里,必须用 MessageBoxW 才能正常显示。
    LosLord
        57
    LosLord  
    OP
       2018-05-03 12:15:01 +08:00
    @BOYPT 我的 Xhell6 正常运行
    est
        58
    est  
       2018-05-03 12:16:40 +08:00
    @geelaw chcp 65001 +1
    BOYPT
        59
    BOYPT  
       2018-05-03 13:06:33 +08:00
    @LosLord #57 哦?出到 6 了?我的还是 xshell5
    MeteorCat
        60
    MeteorCat  
       2018-05-03 13:42:50 +08:00
    有没有人和我一样打开文件仅仅修改几个文件,编译程序的时候全部都是要求把编码给换了....................
    Humorce
        61
    Humorce  
       2018-05-03 13:44:29 +08:00
    开启后 KeePass 出错。
    UnknownR
        62
    UnknownR  
       2018-05-03 14:43:54 +08:00
    常年英文版飘过。。。刚刚还遇到了编码问题,powershell 默认 out-file 不支持 utf-16 也是蛮蛋疼的,中文系统传过来的文件还要删除 utf-16 的 FF 和 FE 头才能正常映射
    boileryao
        63
    boileryao  
       2018-05-03 18:50:49 +08:00   ❤️ 1
    @ZenFX 菜单栏第四个 TAB, 点开后最后一个 item, 鼠标指针移上去, 选成英文就好啦
    redapple02041
        64
    redapple02041  
       2018-05-05 12:16:35 +08:00
    字体那么好看了吗
    LosLord
        65
    LosLord  
    OP
       2018-05-06 18:05:30 +08:00
    @redapple02041 我改成黑体了,4K 屏幕,锯齿也会小很多
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5333 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 94ms · UTC 07:41 · PVG 15:41 · LAX 23:41 · JFK 02:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.