如何将非ASCII字符压缩为Linux的C中的1个字节



我有一个土耳其语列表。我需要比较他们的长度。但是,由于某些土耳其角色是非accii的,所以我无法正确比较它们的长度。非ASCII土耳其字符具有2个字节。

例如:

#include <stdio.h>
#include <string.h>
int main()
{
    char s1[] = "ab";
    char s2[] = "çş";
    printf("%dn", strlen(s1)); // it prints 2
    printf("%dn", strlen(s2)); // it prints 4
    return 0;
}

我的朋友说可以在以下代码行中在窗口中执行此操作:

system("chcp 1254");

他说,它充满了土耳其的炭,到了延长的ASCII桌子上。但是,它在Linux中不起作用。

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

是2017年和2018年。使用UTF-8无处不在(在最近的Linux发行版中,UTF-8是最常见的编码,对于大多数语言环境(7)) - ,当然是系统上的默认值);当然,在UTF-8中编码的Unicode字符可能具有一到六个字节(因此,某些UTF-8字符串中的Unicode字符的数量是strlen给出的)。考虑使用一些UTF-8库,例如libunistring(或其他库,例如glib)。

chcp 1254的东西是一些与UTF-8系统无关的Windows特定内容。所以忘了。

如果您编码GUI应用程序,请使用GTK或QT等小部件工具包。他们都可以处理Unicode,并且能够接受(或转换为UTF-8)。请注意,即使仅显示Unicode(例如,某些UTF-8或UTF-16字符串)也不琐碎,因为字符串可以混合,例如阿拉伯语,日语,西里尔语和英语单词(您需要在从左到右和向右的方向上显示),因此最好找到一个库(或其他工具,例如UTF-8能力的终端模拟器)这样做。

如果您碰巧获取一些文件,则需要知道使用它的编码(这只是您需要获取和遵循的某些 judent )。在某些案例中,文件(1)命令可能会帮助您猜测该编码,但是您需要了解用于制作该文件的编码约定。如果未编码UTF-8,则可以将其转换(前提

一种可能性可能是使用宽字符串存储单词。它不会将字符存储为一个字节,而是解决您的主要问题。要获得一组功能,可以使用您的语言。该程序看起来如下:

#include <stdio.h>
#include <string.h>
#include <wchar.h>
int main()
{
    wchar_t s1[] = L"ab";
    wchar_t s2[] = L"çş";
    printf("%dn", wcslen(s1)); // it prints 2
    printf("%dn", wcslen(s2)); // it prints 2
    return 0;
}

最新更新