如何测试u32string仅用于字母(使用区域设置)

How to test a u32string for letters only (with locale)

本文关键字:区域 设置 何测试 测试 u32string 用于      更新时间:2023-10-16

我正在编写一个编译器(为我自己的编程语言),我希望允许用户使用Unicode字母类别中的任何字符来定义标识符(现代语言,如Go已经允许这样的语法)。我在c++ 11中读了很多关于字符编码的信息,根据我发现的所有信息,使用utf32编码是很好的(它在lexer中迭代速度很快,而且它比c++中的utf8有更好的支持)。

c++中有isalpha函数。我如何测试wchar32_t,如果它是一个字母(在任何语言中分类为"字母"的Unicode代码点)?

这可能吗?

使用ICU遍历字符串并检查是否满足适当的Unicode属性。下面是一个C语言的例子,检查UTF-8命令行参数是否是一个有效的标识符:

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unicode/uchar.h>
#include <unicode/utf8.h>
int main(int argc, char **argv) {
  if (argc != 2) return EXIT_FAILURE;
  const char *const str = argv[1];
  int32_t off = 0;
  // U8_NEXT has a bug causing length < 0 to not work for characters in [U+0080, U+07FF]
  const size_t actual_len = strlen(str);
  if (actual_len > INT32_MAX) return EXIT_FAILURE;
  const int32_t len = actual_len;
  if (!len) return EXIT_FAILURE;
  UChar32 ch = -1;
  U8_NEXT(str, off, len, ch);
  if (ch < 0 || !u_isIDStart(ch)) return EXIT_FAILURE;
  while (off < len) {
    U8_NEXT(str, off, len, ch);
    if (ch < 0 || !u_isIDPart(ch)) return EXIT_FAILURE;
  }
}

注意,ICU在这里使用Java定义,与uax# 31中的定义略有不同。在实际应用程序中,您可能还希望在

之前将其规范化为NFC。

ICU项目中有一个isaplha。我想你可以用这个