gpt4 book ai didi

c - 如何在 C for Linux 中将非 ASCII 字符压缩为 1 个字节?

转载 作者:IT王子 更新时间:2023-10-29 01:07:26 27 4
gpt4 key购买 nike

我有一个土耳其语单词列表。我需要比较它们的长度。但是由于一些土耳其字符是非 ASCII ,我无法正确比较它们的长度。非 ASCII 土耳其语字符占用 2 个字节。

例如:

#include <stdio.h>
#include <string.h>

int main()
{
char s1[] = "ab";
char s2[] = "çş";

printf("%d\n", strlen(s1)); // it prints 2
printf("%d\n", strlen(s2)); // it prints 4

return 0;
}

我的 friend 说可以在 Windows 中使用下面的代码行来做到这一点:

system("chcp 1254");

他说它将土耳其字符填充到扩展的 ASCII 表中。但是它在 Linux 中不起作用。

有没有办法在 Linux 中做到这一点?

最佳答案

现在是 2017 年,很快就是 2018 年了。所以使用 UTF-8 everywhere (在最近的 Linux 发行版中,UTF-8 是最常见的编码,对于大多数 locale(7) -s,当然也是您系统上的默认编码);当然,Unicode以 UTF-8 编码的字符可能有 1 到 6 个字节(因此某些 UTF-8 字符串中的 Unicode 字符数不是strlen 给出)。考虑使用一些 UTF-8图书馆,例如 libunistring (或其他,例如 Glib )。

chcp 1254 是一些 Windows 特定的东西,与 UTF-8 系统无关。所以算了吧。

如果您编写 GUI 应用程序,请使用像 GTK 这样的小部件工具包或 Qt .它们都处理 Unicode 并且能够接受(或转换为 UTF-8)。请注意,即使只是简单地显示 Unicode(例如一些 UTF-8 或 UTF-16 字符串)也很重要,因为字符串可以混合使用,例如阿拉伯语、日语、西里尔语和英语单词(您需要在从左到右和从右到左的方向上显示),所以最好找到一个库(或其他工具,例如支持 UTF-8 的 terminal emulator )这样做。

如果您碰巧获得了一些文件,您需要知道它使用的编码(这只是您需要获得并遵循的一些约定)。在一些情况下,file(1)命令可能会帮助您猜测该编码,但您需要了解用于制作该文件的编码约定。如果它不是 UTF-8 编码的,您可以转换它(前提是您知道源编码),可能使用 iconv(1)命令。

关于c - 如何在 C for Linux 中将非 ASCII 字符压缩为 1 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47607561/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com