加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ANSI C UTF-8问题

发布时间:2020-12-16 03:07:19 所属栏目:百科 来源:网络整理
导读:首先,我使用ANSI C(不是C和任何非标准库,如MS CRT或glibc,……)开发一个独立的平台库. 经过几次搜索后,我发现在ANSI C中进行国际化的最佳方法之一是使用UTF-8编码. 在utf-8中: strlen(s):始终计算字节数. mbstowcs(NULL,s,0):可以计算字符数. 但是当我想
首先,我使用ANSI C(不是C和任何非标准库,如MS CRT或glibc,……)开发一个独立的平台库.

经过几次搜索后,我发现在ANSI C中进行国际化的最佳方法之一是使用UTF-8编码.

在utf-8中:

> strlen(s):始终计算字节数.
> mbstowcs(NULL,s,0):可以计算字符数.

但是当我想随机访问utf-8字符串的元素(字符)时,我遇到了一些问题.

在ASCII编码中:

char get_char(char* assci_str,int n)
{
  // It is very FAST.
  return assci_str[n];
}

在UTF-16/32编码中:

wchar_t get_char(wchar_t* wstr,int n)
{
  // It is very FAST.
  return wstr[n];
}

在这里我的UTF-8编码问题:

// What is the return type?
// Because sizeof(utf-8 char) is 8 or 16 or 24 or 32.
/*?*/ get_char(char* utf8str,int n)
{
  // I can found Nth character of string by using for.
  // But it is too slow.
  // What is the best way?
}

谢谢.

解决方法

也许你有点错误地考虑这个问题. UTF-8是一种编码,可用于序列化数据,例如将其写入文件或网络.然而,这是一个非常重要的编码,并且原始的Unicode代码点串可以以任意数量的编码字节结束.

你应该做的,如果你想处理文本(给定你的描述),就是在内部存储原始的固定宽度字符串.如果您要使用Unicode(您应该),那么每个代码点需要21位,因此最接近的整数类型是uint32_t.简而言之,将所有字符串存储在内部作为整数数组.然后,您可以随机访问每个代码点.

只在写入文件或控制台时编码为UTF-8,在读取时从UTF-8解码.

顺便说一句,Unicode代码点距离角色还有很长的路要走.角色的概念与高级别相比具有简单的一般机制. (例如“a”“重音坟墓” – 两个代码点,多少个字符?)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读