学习C语言中的Unicode

53 阅读6分钟

Unicode是一个全球使用的字符编码标准。它专门用于为全世界每种语言中的每个字符分配一些代码。还有许多其他的编码标准。不幸的是,没有一个编码标准可以适用于全世界所有的语言。因此,Unicode编码标准的出现,确保了通过利用任何语言学的分组来获取和联合任何数据信息。所有基于网络的平台和不同语言都需要Unicode编码,即XML、Java、JavaScript等。在个人电脑中,有两种最常用的Unicode实现方式,即UTF-8和UTF-16。

UTF-8编码是最常见的类型,有8位字符的编码。UTF-8在Linux平台上使用得最多。UTF-16有一个2字节的代码。使用Unicode编码,世界上的每一个字符都被赋予了一个独特的数字,即U+0000和U+10FFFF。例如,字母 "A "的编码是U+0041。让我们举一个新的例子,使其更加完美。假设你有一个两个字的组合,即 "回家"。那么,每个字符都有一个独特的编码模式。结果 "回家 "这个词的编码模式显示如下。

u+0043 u+006f u+006d u+0065 u+0048 u+006f u+006d u+0065

让我们看一下各种例子,看看Unicode编码是如何完成的。我们将使用C语言从其Unicode中获取原始字符。因此,通过使用 "Ctrl+Alt+T "在Ubuntu 20.04桌面上启动你的shell终端。打开控制台应用程序后,尝试创建一个新的C文件,在其中做Unicode。使用 "touch "查询来这样做。需要一个编辑器来打开新创建的文件,即vim或Gnu Nano。因此,到目前为止,我们一直在使用GNU Nano编辑器来打开Unicode.c文件,如下图所示。

例子01:

让我们来看看我们的第一个使用Unicode的例子,从它得到实际的字符。当文件被打开时,我们已经为C语言添加了必要的头,以获得全面的支持。标准输入输出头是必须的。在这之后,我们初始化了一个main()函数,将void作为其参数值。

现在,我们在C语言代码的printf语句中添加了一个长的Unicode "U0001f602 "来打印出它的实际值。返回0语句表明main()函数在此关闭。让我们保存我们的代码,以免造成不便。使用 "Ctrl+S "来实现这一目的。在这之后,我们必须退出当前打开文件的编辑器。为此使用 "Ctrl+X"。

现在,我们回到了终端控制台。让我们使用gcc编译器,编译我们新创建的代码文件 "Unicode.c"。编译是成功的,因为没有发现错误。让我们用控制台中永远的"./a.out "命令来运行这个代码。而且,在我们的Linux shell屏幕上看到作为C代码的输出的笑脸,这是很让人受不了的。这意味着Unicode "U0001f602 "是为这个显示的笑脸编码的。

例子02:

让我们在编码时看看C语言中的其他一些Unicode。所以,我们再次解开了一个类似的文件,并更新了它。头文件与上述例子中使用的相同。主方法的初始化也是一样的。到目前为止,我们在printf语句中发现了区别。我们在其中声明了一个新的Unicode。这种格式是专门为GNU实用程序设计的。这就是为什么我们使用了它。让我们保存更新后的代码,并通过 "Ctrl+S "和 "Ctrl+X "退出该文件。

在编译和执行命令后,我们得到了通常用来表示有一些威胁或警告的标志。你可以在你的控制台看到漂亮的输出。

你也可以使用在printf语句中初始化Unicode的老方法。你可以察觉到,我们已经解锁了同一个文件来更新它。我们已经改变了printf语句中的Unicode格式。我们用"\u2620 "来代替"\x "这种格式。再一次保存你的代码以查看变化。

编译并执行Unicode.c文件后,我们得到了与上面相同的结果。

如果你想知道本例中使用的同样的二进制代码的十六进制输出,可以尝试使用图片中带有 "hexdump "关键字的printf命令。

例子03:

如果你不知道,那么我们要让你知道,"x65 "统一编码用于字符 "e",而统一编码 "x09 "表示近9个字符的空间。因此,我们打开了同一个文件,用 "x65 "替换了之前的编码,看看它是如何工作的。

保存文件后,我们编译并执行了里面的代码。我们得到了字符 "e "的回报,如下图所示。

让我们尝试在字符 "e "的Unicode前使用9个字符的空格。因此,打开同一个文件,用"\x09\x65 "更新printf语句。保存此代码以应用这些变化。

回到终端并编译该代码。编译完成后,我们执行了该文件,得到了附件中显示的结果。字符 "e "已经被显示出来,而在它前面有空格,显示Unicode "x09"。

例04:

让我们找出代表Unicode "x0965 "的字符。用 "nano "命令打开同一个文件,并添加 "不要改变 "的整体代码。唯一需要改变的是在printf语句处。因此,我们已经用新的Unicode,即 "x0965",替换了旧的Unicode。在这之后,我们保存了这段代码并退出了对shell的编译。

在编译和执行这个更新的Unicode脚本后,我们得到了一个错误。它说Unicode是一个Hexa-escape模式,不在我们系统的范围内。

所以,当我们在shell上用 "echo "命令运行它时,它成功地输出了带有空格的数值65。这个格式是非常冷漠的。65代表65,但x09代表空格。因此,printf在shell上显示是相当困难的。echo语句已经把它作为一个变量打印在shell上了;这就是为什么它很容易做到。

例子05:

让我们来看看最后一个例子,在代码中使用Unicode。打开同一个文件,在有printf语句的那一行进行更新。程序的其他部分将保持不变。printf语句已经使用了不同的Unicode,即这次是 "u0965"。用Ctrl+S保存这个新更新的代码,通过Ctrl+X退出,看看这个Unicode属于谁。

这个脚本是用 "Gcc "编译器积累的。运行这段代码显示 "OR "符号返回到Unicode "u0965"。

总结

在这篇文章中,我们讨论了Unicode的概念和它不同的编码实现,即UTF-8和UTF-16。我们也看到了一些例子,在使用C语言时,在shell中显示Unicode的值。