如何将 ANSI 转换为 UTF-8?

How to convert ANSI to UTF-8?

如何将 ANSI 转换为 UTF-8?
我使用 Linux 套接字来接收 HTTP 响应,但是响应中有一些 UTF-8 字符,如果我打印它们,我会发现一些错误字符,像这样:

[ghostworker@ArchForXed b-client]$ ./get-http-response
HTTP/1.1 200 OK
Date: Tue, 14 Jul 2020 03:24:11 GMT
Content-Type: application/json; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: Tengine
S-TIME-NS: 
S-TIME-CONN: 
S-TIME-PRE: 
S-TIME-START: 
S-TIME-TOTAL: 
ETag: "0215910f600c2a23e08f40035c3f881e"
Content-Encoding: gzip
Vary: Accept-Encoding
X-Cache-Webcdn: BYPASS from ks-sh-webcdn-25

b0
�
[ghostworker@ArchForXed b-client]$ 

我知道 ANSI 码不能显示 UTF-8 码,如何将 ANSI 转换为 UTF-8?

I know that ANSI code cannot display UTF-8 code, how could I convert ANSI to UTF-8?

没有“ANSI”这样的编码。如果您指的是 ASCII(又名 ANSI_X3.4-1968),则无需执行任何操作,因为 ASCII 也是有效的 UTF-8。

如果内容已经是 UTF-8 格式(正如字符集 header 暗示的那样),那么将 转换为 UTF-8 是没有意义的。

I use Linux

如果您的意思是要将 UTF-8 转换为 ASCII,那么我想指出的是,您的终端(模拟器)很可能已配置使用 UTF-8,在这种情况下,这种转换将是 counter-productive。另外请注意,如果内容包含目标编码中不存在的字符,则无法显示这些字符。

如果确实需要在 UTF-8 和其他一些编码之间进行转换(如果不是从 ASCII 到 UTF-8 的转换),那么您会发现 C++ 没有标准的方法来执行这样的转换。您可以阅读相应编码的规范并自己实现转换 non-trivial 并且可能不适合堆栈溢出答案,或者(几乎总是更好的选择)您可以通过以下方式节省时间使用其他人编写的实现。


你真正需要做的首先是注意这个header:

Content-Encoding: gzip

并得出结论,响应不是文本,而是压缩算法的二进制结果,您需要对其进行解压缩以使其可读。 C++ 中也没有标准的(解)压缩函数。