如何在C中使用unicode字符?

如何在C中使用unicode字符?,c,unicode,lex,C,Unicode,Lex,我已经用C写了一个Lexer,它目前成功地用ASCII来lexes文件,但是我不知道如何使用unicode。我需要什么unicode来支持lex,例如我应该支持utf-8、utf-16等。Rust或Go等语言支持什么 如果是的话,有没有图书馆可以帮助我,尽管我更愿意自己尝试,这样我就可以学习了。即使这样,一个我可以阅读学习的小型图书馆也很棒。已经有了lex的版本(以及其他支持UniCode的lexer工具),它们在WikiPedia页面上列出了:。上还有一个lexer工具列表。总之,以下工具处理

我已经用C写了一个Lexer,它目前成功地用ASCII来lexes文件,但是我不知道如何使用unicode。我需要什么unicode来支持lex,例如我应该支持utf-8、utf-16等。Rust或Go等语言支持什么


如果是的话,有没有图书馆可以帮助我,尽管我更愿意自己尝试,这样我就可以学习了。即使这样,一个我可以阅读学习的小型图书馆也很棒。

已经有了lex的版本(以及其他支持UniCode的lexer工具),它们在WikiPedia页面上列出了:。上还有一个lexer工具列表。总之,以下工具处理UniCode:

  • -JavaCC生成用Java编写的词法分析器
  • -用于Java的词法分析器生成器
  • —C++和C++的通用通用词法分析器生成器
  • -用于F的字节和Unicode字符输入的lexer生成器#
当然,也有W3.org使用的技术,@jim mcnamara在

您说您已经在C中编写了自己的lexer,但是您已经将标记
lex
用于名为
lex
的工具;也许这是疏忽

在评论中你说你没有用过正则表达式,还想学习。学习一些关于语言识别理论的知识是编写一个高效且有效的词汇表的关键。被识别的符号被分类为a或a,其可由描述。正则表达式可以通过实现有限状态自动机(或)的编码来实现。大多数有经验的编码人员应该知道并能够识别和利用这种形式:

while ( not <<EOF>> ) {
  switch ( input_symbol ) {
    case ( state_symbol[0] ) :
         ...
    case ( state_symbol[1] ) :

        ...
    default:
        ....
   }
}
while(非){
开关(输入_符号){
案例(状态符号[0]):
...
案例(状态符号[1]):
...
违约:
....
}
}
如果以这种方式编码,那么无论处理的符号是8位还是16位,相同的编码都可以简单地工作,因为算法编码模式保持不变


在不了解基本理论和实践的情况下,词汇分析器的特殊编码最终会有其局限性。我想你会发现多读一点这方面的内容是有益的。

我很久以前就有过这个问题。没有代码给你-但是试试这个:即使我没有使用Flex/Lex这个东西,这个能帮我吗?我读了一会儿,发现它很有用。我不知道你在完全重写莱克斯。我的错,完全重写莱克斯?抱歉,我有点困惑,你是说手工编写lexer吗?虽然为特定语言从头开始编写lexer通常比通过
lex
或类似工具生成lexer更难,但并不一定那么难。当然没有编写lexer生成器(如
lex
本身)那么难。