我有一个土耳其语列表。我需要比较他们的长度。但是,由于某些土耳其角色是非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;
}