• 今天遇到Windows 10里安装的Ubuntu(WSL)的缺点


    随着技术的发展,越来越多开发者转向使用 Windows Subsystem for Linux(WSL)在 Windows 10 上进行开发,也就是说不用虚拟机,不用准备多一台电脑,只需要在Windows 10/11 里安装 WSL 就能体验 Linux 系统。因此我在 Win10 系统里安装了Ubuntu 20 系统学习 Linux 基础,可以用来编译 C / C++ 代码,体验同一个代码编译运行与 Windows 环境下的差别。

    之前就听说 WSL 有一些潜在的限制,无论性能还是功能都不能100%取代裸机 Linux 系统。今天就被我逮到 WSL 下的 Ubuntu 的一个缺点:输出宽字符串(wide string)时失败。

    比如下面一段把普通字符串转换成宽字符串的 C 代码:

    #include 
    #include 
    #include 
    #include 
    #include 
        
    int main() {
    	// Windows环境下要设为 setlocale(LC_ALL, "en-US.UTF-8");
    	// Linux环境下设为 setlocale(LC_ALL, "");
    	// 设置不当的话,转换后的宽字符串长度不正确
        setlocale(LC_ALL, "");
    
        char* str = "22年2月22日";
        int str_len = strlen(str);
        printf("narrow string: %s\n", str);
        printf("narrow string length: %d\n", str_len);
    
        size_t len = strlen(str) + 1;
        wchar_t* wstr = (wchar_t*)malloc(len * sizeof(wchar_t));
        size_t wlen = mbstowcs(wstr, str, len);
    
        wprintf(L"wide string: %ls\n", wstr);
        printf("wide string length: %zu\n", wlen);
        for(size_t i=0; i<wlen; i++)
            wprintf(L"%lc\t%d\n", wstr[i], (int)wstr[i]);
    
        free(wstr);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    这段代码将普通字符串“22年2月22日”转换成宽字符串格式,得出正常的长度为8,然后输出各个字符值。在 Windows 环境下,必须在主程序里设置setlocale(LC_ALL, "en-US.UTF-8");或者setlocale(LC_ALL, "zh-CN.UTF-8");,使用 clang 编译运行的结果才能正常:
    在这里插入图片描述
    到了 WSL 的 Ubuntu 环境,由于Ubuntu终端的字符编码默认是UTF-8,因此主程序中要把 LC_ALL后面的字符串置空:setlocale(LC_ALL, "");,然后编译运行:

    在这里插入图片描述
    转换后的宽字符串长度是8,这是正确的,但是无法输出转换后的字符串以及每个字符对应的值。我尝试了各种办法修改 wprintf 和 printf 语句,但输出结果无济于事,令人百思不得其解。

    直到后来我在安卓手机上安装了Termux(一款运行于安卓系统的 Linux 模拟器),然后在手机上运行 clang 编译再运行 ~~ 结果一切正常了。

    在这里插入图片描述

    换了环境,豁然开朗!

    由此可见 Windows 10 的 WSL(Ubuntu) 在处理特定操作时确实有其局限性。

  • 相关阅读:
    家电生产线数控机床上下料长臂机器人组设计
    Kotlin协程:线程的桥接与切换
    航模模拟器(加密狗)
    软件安全需求分析
    spring boot 基础特性
    计算机三级等级考试
    C++ 基础与深度分析 Chapter9 序列与关联容器(容器的概述、序列容器)
    鸿蒙ArkTS Api9 AES CBC 加密
    普冉PY32系列(十一) 基于PY32F002A的6+1通道遥控小车II - 控制篇
    HALCON-从入门到入门-阈值分割定位算子综合运用
  • 原文地址:https://blog.csdn.net/Scott0902/article/details/134466486