我正在开发一个函数,以便在显示器/LCD上正确地显示阿拉伯语单词。(阿拉伯字母有四种不同的模式。)我有一系列的阿拉伯字母(Map array)在不同的状态。在识别阿拉伯字母之后,我需要重新对齐字母.我的问题是如何通过表(Map Table)将Unicode字符放到String variable (pBuffer)中?
例如:要写出单词باب,您需要从Map table中选择字母,并将其放在String中发送到显示器/液晶显示器。
...
const unsigned char Map[][5] PROGMEM = {
/* code, isolated, initial, medial, final */
{0x0621, 0xFE80, 0x0000, 0x0000, 0x0000 }, //1 /* HAMZA ء*/
{0x0622, 0xFE81, 0x0000, 0x0000, 0xFE82 }, //2/* ALEF_MADDA آ*/
{0x0623, 0xFE83, 0x0000, 0x0000, 0xFE84 }, //3/* ALEF_HAMZA_ABOVE أ*/
{0x0624, 0xFE85, 0x0000, 0x0000, 0xFE86 }, //4/* WAW_HAMZA ؤ*/
{0x0625, 0xFE87, 0x0000, 0x0000, 0xFE88 }, //5/* ALEF_HAMZA_BELOW إ*/
{0x0626, 0xFE89, 0xFE8B, 0xFE8C, 0xFE8A }, //6/* YEH_HAMZA ئ*/
{0x0627, 0xFE8D, 0x0000, 0x0000, 0xFE8E }, //7/* ALEF ا*/
{0x0628, 0xFE8F, 0xFE91, 0xFE92, 0xFE90 } //8/* BEH ب*/
};
String pBuffer;
pBuffer += ((char)(Map[7][4]));
pBuffer += ((char)(Map[6][6]));
pBuffer += ((char)(Map[7][3]));
u8g2.setCursor(5, 20);
u8g2.print(pBuffer);
...不幸的是,上面使用的方法不起作用。如何从上面的"Map“表中选择字符并将它们放在一个String变量中?
发布于 2019-08-28 17:14:59
首先,我必须建议您查找那些阿拉伯字符的UTF-8值.Arduino和u8g2都支持UTF-8编码,但不支持UTF-16.从UTF-8值数组开始,解决这个问题要简单得多。
对于UTF-8字符,编译器可以在字符串文本中转换代码点:
String character = u8"\u0628"; // ب在内部,该字符串将包含两个字节,表示UTF-8中的"ب“。单个char不足以存储UTF-8或UTF-16中的任何阿拉伯字符,因此必须使用数组(char*)或String。
Arduino IDE还允许您直接在代码中编写Unicode字符文本:
String character = "ب";只要源代码以UTF-8格式保存,字符串将与上面的u8"\u0628"值相同。
您可以重写字符映射以使用String,然后按字面顺序输入阿拉伯字符或使用代码点方法:(例如此处使用重音拉丁字符)
const String Map[][5] PROGMEM = {
{"a", "à", "á", "A", "Á"},
{"e", "è", "é", "E", "É"}
};当然,String将使用超过2个字节来存储这些字符,因此您可以通过将字符存储为16位整数来节省空间,但是您必须先进行一些转换。
Unicode代码点实际上不是您将在字符缓冲区中看到的二进制表示。U+0628 = ب,但实际的二进制表示是0xD8A8。这是您应该存储在Map中的值,而不是您已经拥有的代码点(0x0628)。
const uint16_t Map[][5] PROGMEM = {
{0xD8A8, ..., ..., ...},
...
};如果您将String用于映射,则可以轻松地从它构建字符串:
String output = Map[i][2] + Map[j][3] + Map[k][4];如果使用uint16_t,则必须将整数值拆分为两个字节以添加字符:
uint16_t v = Map[i][j]; // v = 0xD8A8 for example
char lo = v & 0xFF; // The D8 part of 0xD8A8, lo = 0xD8
char hi = v >> 8; // The A8 part of 0xD8A8, hi = 0xA8
String output = String(hi) + String(lo); // output = {0xA8, 0xD8}最后,您必须将String转换为char*缓冲区,以便与U8g2::drawUTF8()一起使用。您可以通过使用output.c_str()获取底层char*缓冲区来实现这一点。
https://stackoverflow.com/questions/57696189
复制相似问题