【问题标题】:How to convert char cyrillic array to array of unicode code of every char symbol?如何将 char cyrillic 数组转换为每个 char 符号的 unicode 代码数组?
【发布时间】:2019-08-14 19:10:06
【问题描述】:

我有类似的东西

char[] = "тест";

我需要将每个符号转换为该符号的代码。 (А - 53392
Б - 53393 В - 53394 等) 现在我用

char symb = 'у';
int number = symb - ' ';

int symbol = 'У'

但它只适用于一个符号,我有错误

warning: multi-character character constant [-Wmultichar]

我正在尝试使用

long int str[] = { 'А' , 'Б', 'В'};
printf("char_offset:%d\n", str[1]);

和它的工作原理,但是用这种方法声明带有许多符号的字符串并不容易。我有这个错误

Xlib1.c:295:17: warning: multi-character character constant [-Wmultichar]
   int str[] = { 'А' , 'Б', 'В'};
                 ^
Xlib1.c:295:24: warning: multi-character character constant [-Wmultichar]
   int str[] = { 'А' , 'Б', 'В'};
                        ^
Xlib1.c:295:30: warning: multi-character character constant [-Wmultichar]
   int str[] = { 'А' , 'Б', 'В'};
                              ^

但它的工作原理。 我用这个键和 gcc

 -finput-charset=UTF-8 -std=c11 -fextended-identifiers

我需要在 stm32 上使用这个代码。帮助我将带有西里尔字符的字符串转换为字符串中字符的 int 代码数组

【问题讨论】:

  • char 只有 8 位,因此不足以存储那些大的 Unicode 代码点。你在哪里使用这些字符串?接收函数是否支持 Unicode?​​span>
  • 我可以使用什么类型的数组来代替 char?我正在尝试使用 long int str[] = { 'А' , 'Б', 'В'}; printf("char_offset:%d\n", str[1]);及其工作,
  • 它不起作用。编译器已经给了你很多有用的警告,比如“多字符字符常量 [-Wmultichar]”。它可能看起来 像它正在工作,因为在 C 中有 multi-character literals'ABCD' 一样,但它不是人们期望在字符串中的字符。完全不清楚你想对这些字符做什么,但你必须将它们存储为字符串,或者使用wchar_t(这不是一个好主意)
  • 例如 АБ 是 Unicode U+0410U+0411 是十进制的 1040 和 1041,而不是您在输入中看到的 53392,因为多字符文字经常
  • 从您的问题中不清楚(对我来说)您要做什么,也不清楚您使用什么作为输入或输出字符集编码。您可以考虑使用带有 L 前缀的 C90 宽字符编码:L'Б'L"Б"。或者您可以考虑使用 C11 Unicode 编码:uu8U 作为前缀代替 L。 (有关详细信息,请参阅 C11 §6.4.4.4 Character constants§6.4.5 String literals。)您想要 UTF-32、UTF-16 还是 UTF-8 作为输出?输入代码集是什么?

标签: c unicode char symbols cyrillic


【解决方案1】:

这是我转换 unicode 符号的函数。我在函数末尾添加检查。感谢@phuclv 的回复。

int UniCyrConv(char *str, char *unicode_code)
{
        int num1=256+(int)str[0];      //first unicod byte
            int num2=256+(int)str[1];      // second
        int conv1 = (num1 & 31)*64;    // remove 3 first bits and adding 6 zero to end
        int conv2 = (num2 & 63);       // remove 2 first bits
        int final = (conv1 | conv2);   // 1 + 2
        DecToHex(final, unicode_code); /// to hex      
        return final;
}

检查符号是否是西里尔文

        if ( (final  >= 1040) && (final <= 1103) ){
        DecToHex(final, unicode_code); /// to hex      
        return final;
        }
        else { return -1; }

【讨论】:

  • 如果这不是答案,请编辑您的问题并在此处添加此信息。
  • 这是答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-06-08
  • 2022-01-22
  • 2013-06-06
  • 2016-03-10
  • 2019-08-04
  • 1970-01-01
  • 2017-03-05
  • 2017-09-17
相关资源
最近更新 更多