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

文章讲述了开发者在Windows10的WSL中使用Ubuntu遇到的宽字符串转换问题,指出WSL在某些特定操作(如宽字符串处理)上存在局限,建议在遇到难题时考虑切换到其他Linux环境,如Termux。

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

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

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include <locale.h>
    
int main() {
	// Windows环境下要设为 setlocale(LC_ALL, "en-US.UTF-8");
	// Linux环境下设为 setlocale(LC_ALL, "");
	// 设置不当的话,转换后的宽字符串长度不正确
    setlocale(LC_ALL, "");

    char* str = "22年2月22日";
    int len = strlen(str);
    printf("narrow string: %s\n", str);
    printf("narrow string length: %d\n", len);

    wchar_t* wstr = (wchar_t*)malloc((len + 1) * sizeof(wchar_t));
    size_t wlen = mbstowcs(wstr, str, len+1);

    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;
}

这段代码演示了普通字符串“22年2月22日”默认状态下的长度是14字节,但这个长度是机内码的长度,而人类理解的长度应该是8才对,在Python和Java里也得出8,为了使 C 代码获得与Python、Java代码计算一样的长度,必须把它转换成宽字符串格式。代码接下来输出各个字符值。在 Windows 环境下,必须在主程序里设置本地代码页环境setlocale(LC_ALL, "en-US.UTF-8");或者setlocale(LC_ALL, "zh-CN.UTF-8");,使用 clang 编译运行的结果才能正常输出宽字符串长度为8:
在这里插入图片描述
到了 WSL 的 Ubuntu 环境,由于Ubuntu终端的字符编码默认是UTF-8,因此主程序中要把 LC_ALL后面的字符串置空:setlocale(LC_ALL, "");,否则计算出来的宽字符串长度也不正确。然后编译运行:

在这里插入图片描述
经过设置setlocale(LC_ALL, "");以及mbstowcs转换后的宽字符串长度是8,正确。但是接下来的 wprintf 语句无法输出转换后的字符串以及每个字符对应的值。我尝试了各种办法修改 wprintf 、 printf 、setlocale 语句,但输出结果无济于事,令人百思不得其解。

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

在这里插入图片描述

换了环境,豁然开朗!

由此可见 Windows 10 的 WSL(Ubuntu) 在处理特定操作时确实有其局限性。在遇到令人摸不着头脑的问题时不妨切换到其它 Linux 环境再试试。

<think>首先,用户的问题是在Windows电脑上安装Linux Ubuntu系统。我需要根据提供的引用信息来回答,但引用主要是关于安装方法的概述,我应该结合这些信息来提供详细的步骤。 引用内容总结: - 引用[1]:提到安装Linux的几种选择:双系统、虚拟机、WSLWindows Subsystem for Linux)。 - 引用[2]:描述了通过WSL2安装Ubuntu的具体步骤,包括创建账号。 - 引用[3]:比较了虚拟机和WSL的优缺点,并给出了WSL安装方法。 - 引用[4]:讨论了安装双系统的步骤,包括BIOS设置。 用户明确说“我想在Windows电脑上安装Linux Ubuntu”,所以我需要提供安装方法。主要方法有: 1. 双系统(dual boot) 2. 虚拟机(如VirtualBox) 3. WSLWindows Subsystem for Linux) 我应该覆盖所有选项,但重点在WSL上,因为引用[2]和[3]详细描述了它,而且它是最简单的方法。 回答结构: - 介绍安装Linux Ubuntu的几种方法。 - 详细说明每种方法的步骤。 - 推荐一个方法(WSL可能最简单)。 - 最后生成相关问题。 确保回答使用中文,结构清晰。 关键点: - 使用$...$和$$...$$格式用于数学表达式,但这可能不涉及数学,所以可能不需要。 - 生成相关问题。 - 添加引用标识,如[^1],在相关段落末尾。 步骤: 1. **介绍方法**:列出三种主要方法。 2. **详细步骤**: - 双系统:需要分区、安装介质、BIOS设置(如禁用Secure Boot)。 - 虚拟机:使用VirtualBox或VMware,安装Ubuntu镜像。 - WSL:通过Windows功能启用WSL安装Ubuntu。 3. **推荐WSL**:因为它简单、资源占用少。 4. **生成相关问题**:在最后添加相关问题。 引用整合: - 在描述双系统时,引用[4]提到禁用Secure Boot。 - 在描述WSL时,引用[2]和[3]给出安装命令和账号创建。 - 在描述虚拟机时,引用[1]和[3]提到资源占用高。 实际步骤: - **WSL安装**(基于引用[2]和[3]): 1. 启用WSL功能。 2. 安装Ubuntu from Microsoft Store或通过命令行。 3. 启动Ubuntu并创建用户。 - **双系统安装**(基于引用[4]): 1. 创建安装介质(USB)。 2. 调整BIOS设置(禁用Secure Boot)。 3. 分区和安装。 - **虚拟机安装**: 1. 下载VirtualBox。 2. 创建虚拟机,分配资源。 3. 安装Ubuntu镜像。 回答应逐步引导用户。 最后,生成相关问题: - 例如:如何配置WSL?双系统启动问题如何解决?Ubuntu桌面环境安装? 确保回答真实可靠,基于引用。</think>### 在Windows电脑上安装Linux Ubuntu系统 在Windows电脑上安装Linux Ubuntu系统有多种方法,每种方法各有优缺点。我将根据您的需求,详细介绍三种主流安装方式:双系统(dual boot)、虚拟机(Virtual Machine)和Windows子系统(WSL)。推荐优先使用**WSLWindows Subsystem for Linux)**,因为它安装简便、资源占用低,且无需重启电脑[^1][^3]。以下是详细步骤: #### 1. **使用WSL安装Ubuntu(推荐方法)** WSL是微软官方支持的Linux子系统,直接在Windows内核上运行,适合日常开发和命令行操作。安装步骤如下: 1. **启用WSL功能**: - 以管理员身份打开PowerShell(右键点击开始菜单 > Windows PowerShell (管理员))。 - 输入命令:`wsl --install`,然后按Enter。此命令会自动启用WSL和虚拟机平台功能[^2][^3]。 - 如果提示需要重启电脑,请重启。 2. **安装Ubuntu发行版**: - 重启后,打开Microsoft Store,搜索“Ubuntu”。 - 选择“Ubuntu 22.04 LTS”(或其他版本),点击“获取”进行安装安装文件约500MB,下载速度取决于网络[^2]。 3. **启动Ubuntu并创建账号**: - 安装完成后,从开始菜单打开Ubuntu应用。 - 首次启动时会提示创建Linux管理员账号和密码(输入密码时不会显示字符,这是正常现象)。示例: ``` Welcome to Ubuntu 22.04.3 LTS... Enter new UNIX username: your_username New password: Retype new password: ``` - 创建成功后,即可在终端中使用Ubuntu命令[^2]。 4. **验证安装**: - 在PowerShell输入`wsl -l -v`,查看已安装Linux发行版。输出应显示Ubuntu及版本号。 - 在Ubuntu终端输入`lsb_release -a`,确认系统信息。 **优点**:安装快速(约10分钟)、无需分区、文件互通(Windows路径在`/mnt/c/`下)、资源占用少[^3]。 **缺点**:默认无图形界面(可通过额外配置X Server实现)。 #### 2. **使用虚拟机安装Ubuntu** 虚拟机(如VirtualBox)适合需要完整Linux桌面环境或测试多系统的场景。步骤如下: 1. **安装虚拟机软件**: - 下载VirtualBox(免费):访问[VirtualBox官网](https://www.virtualbox.org/),下载Windows安装包。 - 安装时保持默认设置。 2. **下载Ubuntu镜像**: - 访问[Ubuntu官网](https://ubuntu.com/download/desktop),下载ISO文件(如Ubuntu 22.04 LTS)。 3. **创建虚拟机**: - 打开VirtualBox,点击“新建”。 - 设置虚拟机名称(如“Ubuntu”),类型选“Linux”,版本选“Ubuntu (64-bit)”。 - 分配内存(建议至少4GB)和硬盘空间(动态分配,建议20GB以上)。 4. **安装Ubuntu**: - 启动虚拟机,选择下载的ISO文件作为启动盘。 - 按照安装向导操作:选择语言、分区(默认即可)、创建用户账号。 - 安装完成后,重启虚拟机进入Ubuntu系统。 **优点**:获得完整桌面环境、隔离性好[^1][^3]。 **缺点**:资源占用高(需分配内存和CPU)、启动较慢、文件共享需手动设置[^3]。 #### 3. **安装双系统(dual boot)** 双系统适合需要高性能Linux环境的用户,但涉及磁盘分区,操作风险较高。步骤如下: 1. **准备安装介质**: - 下载Ubuntu ISO文件(同上)。 - 使用Rufus工具将ISO写入USB闪存盘(确保U盘大于8GB)。 2. **调整BIOS/UEFI设置**: - 重启电脑,进入BIOS(通常按F2、Del或Esc键)。 - 禁用Secure Boot(参考引用[4]:进入“Secure Boot”选项,设置为“Disable”)。 - 设置U盘为第一启动项,保存退出(按F10)[^4]。 3. **分区和安装**: - 从U盘启动,选择“Install Ubuntu”。 - 在分区步骤,选择“Something else”手动分区: - 创建新分区:`/`(根目录,类型ext4,大小至少20GB)。 - 创建交换分区(swap,大小建议为内存的1-2倍)。 - 安装引导加载器到Windows引导分区(避免覆盖Windows引导)。 4. **完成安装**: - 设置用户名和密码,重启电脑。 - 启动时会出现GRUB菜单,选择UbuntuWindows进入系统。 **优点**:性能最佳、原生Linux体验[^4]。 **缺点**:操作复杂、需备份数据(分区可能丢失数据)、每次切换系统需重启[^1]。 ### 推荐总结 - **新手或日常使用**:优先选WSL,简单快捷[^2][^3]。 - **开发或测试**:虚拟机更灵活。 - **高性能需求**:双系统适合。 安装前务必备份重要数据,以防意外。如果遇到网络问题(如WSL下载慢),可尝试切换下载源或使用代理[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值