发布于 ,更新于 

Windows 下如何将标准输出设置为 UTF-8 编码

Windows 下如何将控制台的标准输出设置为 UTF-8 编码

C# 语言

C# 语言在简体中文版的 Windows 下默认使用 GBK 编码。 切换标准输入输出的字符编码只需要设置 Console 对象的输出字符编码即可。在代码最初处加上 Console.OutputEncoding = System.Text.Encoding.UTF8 。上例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
using System;

namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
Console.OutputEncoding = System.Text.Encoding.UTF8; // 关键这句
Console.WriteLine("Hello World! 测试中文输出的 UTF-8 字符串");
}
}
}

编译成 ConsoleApp.exe,然后在命令行中执行 ConsoleApp.exe,可以看到,正常输出中文字,不会乱码。
然后执行:

1
ConsoleApp.exe  >  a.txt

把输出结果重定向到 a.txt 文件中,用编辑器打开 a.txt,可以在编辑器中看到文件编码为 UTF-8 。

文本文件

C/C++ 语言

简体中文版的Windows 控制台输出的字符 CodePage 为 GBK。在需要输出 UTF-8 文本到标准输出之前,先调用 Windows API 进行设置,使用 SetConsoleOutputCP 这个 API 来先设置控制台输出的 CodePage 为 UTF-8。上例子:

1
2
3
4
5
6
7
8
9
10
11
12
// u8test.cpp, 这个源代码要保存为 UTF-8 编码
#include <stdio.h>
#include <iostream>
#include <Windows.h>

int main()
{
SetConsoleCP(CP_UTF8);
SetConsoleOutputCP(CP_UTF8);
printf("中文字符串1 \n"); // C 风格的标准输出
std::cout << "中文字符串2" << std::endl; // C++ 风格的 I/O 流输出
}
  1. SetConsoleCP 函数用于设置标准输入的字符编码 CodePage
  2. SetConsoleOutputCP 函数用于设置标准输出的字符编码 CodePage

用 mingw gcc 编译的命令:

1
g++ -s -o u8test.exe u8test.cpp

用 VC++ 编译则需要加上 -utf-8 命令参数,如果不加上 -utf-8 的话,编译器会把字符串的编码默认转换为 GBK。( -utf-8 命令行参数仅仅在 VC++ 2015版本以上才有效 )

1
cl -MD -utf-8 u8test.cpp

Go / Rust 语言

这些新兴语言没有历史包袱,标准库已经默认将标准输入输出的字符编码设置为 UTF-8 了,所以不需要过多关注这些,直接开干使用即可。