【问题标题】:How can I use Unicode in Turbo C++?如何在 Turbo C++ 中使用 Unicode?
【发布时间】:2019-11-21 13:42:02
【问题描述】:

如何在 Turbo C++ 中使用 Unicode 符号?

我特别想要上标和下标符号。

我必须使用过时的 Turbo C++,因为这是我学校提供的,我必须在我的项目中使用它。

【问题讨论】:

  • 你基本上不能。 “Turbo C++”是在恐龙在地球上漫游时发明的,而我们所知道的 Unicode 却鲜为人知。
  • 例如UTF-8 你可以把它当作字节数组来处理,你必须自己实现everything
  • 所以用户需要完成他们的个人资料,这样我们才能知道他们来自哪里。 DOS 模拟器没有准确呈现子/上标文本的管道。你可以得到一些上标,例如look here。请记住,您的老师并不希望您这样做。
  • 如果你必须使用 Turbo C++ 那么你不应该被要求使用 Unicode。
  • Turbo C++ 甚至不是 C++ 编译器,因为它比 1998 年的第一个 C++ 标准早了近十年

标签: c++ unicode subscript turbo-c++ superscript


【解决方案1】:

如前所述,Turbo C++ 不会让您直接访问 Unicode。它可能太旧了,甚至无法生成可用于使用系统库 (DLL) 的代码,因此 - 即使手动重新创建头文件,您也无法调用可以正确输出的 wprintf Unicode 甚至在神秘的 cmd 终端上,微软至今仍随 Windows 一起发布。

但是,cmd 终端中使用的默认字符编码支持一些非 ASCII 字符 - 这完全取决于您的操作系统的语言(区域设置)配置。 (例如,对于西欧语言,它通常是 "cp-852" - 虽然它可以是 CP 850,如果您的 Windows 是英文的话。

这些传统的 8 位字符映射编码都不会包含所有十位数字作为上标 - 但您可能有一些可用的(例如,CP 850 功能“¹,²,³”)。

因此,您可以检查终端代码页,并在 Wikipedia 上查看其代码 - 您可以在 Windows 终端中使用 chcp 命令检查和更改当前代码页。如果您的 Windows 版本支持 UTF-8,它涵盖了所有可打印的 Unicode 字符,您必须在终端中键入 chcp 65001。 (我不知道哪些 Windows 版本支持该功能,也不知道您使用的是哪个版本。)

一旦你设法做到这一点,你所需要的就是打印 UTF-8 中上标数字的字节序列,对字符串中的字符使用“\xHH”编码(我不确定 Turbo C++ 将允许它。否则,`printf ("%c%c", 0xHH, 0xHH) 将起作用。)

为了您的方便,我附上了上标的代码点和 UTF-8 编码:

0x00B2: SUPERSCRIPT TWO - ² - utf-8 seq: b'\xc2\xb2'
0x00B3: SUPERSCRIPT THREE - ³ - utf-8 seq: b'\xc2\xb3'
0x00B9: SUPERSCRIPT ONE - ¹ - utf-8 seq: b'\xc2\xb9'
0x0670: ARABIC LETTER SUPERSCRIPT ALEF - ٰ - utf-8 seq: b'\xd9\xb0'
0x0711: SYRIAC LETTER SUPERSCRIPT ALAPH - ܑ - utf-8 seq: b'\xdc\x91'
0x2070: SUPERSCRIPT ZERO - ⁰ - utf-8 seq: b'\xe2\x81\xb0'
0x2071: SUPERSCRIPT LATIN SMALL LETTER I - ⁱ - utf-8 seq: b'\xe2\x81\xb1'
0x2074: SUPERSCRIPT FOUR - ⁴ - utf-8 seq: b'\xe2\x81\xb4'
0x2075: SUPERSCRIPT FIVE - ⁵ - utf-8 seq: b'\xe2\x81\xb5'
0x2076: SUPERSCRIPT SIX - ⁶ - utf-8 seq: b'\xe2\x81\xb6'
0x2077: SUPERSCRIPT SEVEN - ⁷ - utf-8 seq: b'\xe2\x81\xb7'
0x2078: SUPERSCRIPT EIGHT - ⁸ - utf-8 seq: b'\xe2\x81\xb8'
0x2079: SUPERSCRIPT NINE - ⁹ - utf-8 seq: b'\xe2\x81\xb9'
0x207A: SUPERSCRIPT PLUS SIGN - ⁺ - utf-8 seq: b'\xe2\x81\xba'
0x207B: SUPERSCRIPT MINUS - ⁻ - utf-8 seq: b'\xe2\x81\xbb'
0x207C: SUPERSCRIPT EQUALS SIGN - ⁼ - utf-8 seq: b'\xe2\x81\xbc'
0x207D: SUPERSCRIPT LEFT PARENTHESIS - ⁽ - utf-8 seq: b'\xe2\x81\xbd'
0x207E: SUPERSCRIPT RIGHT PARENTHESIS - ⁾ - utf-8 seq: b'\xe2\x81\xbe'
0x207F: SUPERSCRIPT LATIN SMALL LETTER N - ⁿ - utf-8 seq: b'\xe2\x81\xbf'
0xFC5B: ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM - ﱛ - utf-8 seq: b'\xef\xb1\x9b'
0xFC5C: ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM - ﱜ - utf-8 seq: b'\xef\xb1\x9c'
0xFC5D: ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM - ﱝ - utf-8 seq: b'\xef\xb1\x9d'
0xFC63: ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM - ﱣ - utf-8 seq: b'\xef\xb1\xa3'
0xFC90: ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM - ﲐ - utf-8 seq: b'\xef\xb2\x90'
0xFCD9: ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM - ﳙ - utf-8 seq: b'\xef\xb3\x99'

(这是在交互模式下使用以下 Python sn-p 生成的:)

import unicodedata
for i in range(0, 0x10ffff):
    char = chr(i)
    try:
        name = unicodedata.name(char)
    except ValueError:
        pass
    if "SUPERSCRIPT" not in name:
        continue
    print(f"0x{i:04X}: {name} - {char} - utf-8 seq: {char.encode('utf-8')}")

【讨论】:

    【解决方案2】:

    旧的 Turbo C++(不是 BDS2006 Turbo C++)适用于 MS-DOS 16 位目标,因此它根本不支持 Unicode,也不支持 TTF字体等。所以为了让 Unicode 工作,你有两个选择:

    1. 自行实现 Unicode

      所以你需要渲染 Unicode 文本。在图形模式下很简单。只需使用“完整”的 Unicode 字体,例如:

      IIRC 它是光栅,因此很容易解码和渲染(您甚至可以在较新的操作系统中从它创建一个大位图,并在 MS-DOS 中将其用作字体)。对于图形模式下的渲染,您可以使用直接像素访问 (VGA/VESA)。在文本模式下,这要困难得多,因为您需要使用您实际使用的字符来更新 EGA/VGA 字体。但是屏幕上实际呈现的不同字符的数量限制为每种字体 256 个。有关详细信息,请参阅:

      当然,支持整个 Unicode 在 MS-DOS 下是个问题,因为即使在小分辨率下,完整字体通常也有 12-64 MB 大,因此您需要有足够的 XMS 内存(因为您不再适合 640 KB 或 1 MB 模型)并实现对已使用字符的快速分页/访问以便快速使用......另一个选择是使用 32 位保护模式,您可以获得 32 位线性内存访问(但是你没有更多的 MS-DOS 支持,需要自己做所有操作系统的东西,但是像 DOS4GW 这样的扩展程序可以为你做一些......)

      您可以使用一种快捷方式来避免内存管理。您可以创建一个RAM disk 并将原始字体图像作为文件存储在 RAM 磁盘中。对它的文件访问应该很快(比访问 HDD 快得多)......所以在应用程序启动时,将字体从 HDD 复制到 RAM 磁盘位置,然后使用它......因此,不需要 XMS没有了。

    2. 将 Unicode 字符串转换为扩展的 ASCII

      使用支持标准 ASCII 表之外的特殊字符的字符。对此有 MS-DOS 实用程序(支持 latin1、2、kamenicky...),它们提供扩展的字体和键盘处理(在选定的代码页内)。

      因此,您需要为要支持的所有字符建立一个转换表,并在 UTF-8、UTF-16 和 ASCII + 扩展字符之间进行映射。但是,这种方式只能支持 128 个扩展字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 2013-08-19
      相关资源
      最近更新 更多