如何反转给定单词中的阿拉伯字母并保存字母的形式?

How can I reverse Arabic letters in a given word and save the letter's form?

我是 Dart 和 Flutter 的初学者:

假设我想反转这个单词中的阿拉伯字母:'ممم',正如你所看到的,这是一个独特的字母(发音为 m),在一个单词的树位置中具有树形:

最后的结果应该是:ﻢﻤﻣ

由于codeUnits和runes保存每一个字符的功能非常强大,所以我想使用codeUnits来保存单词的字母。这将保存字母的形式:它是在初始位置、中间位置还是最终位置。这类似于a:Åǻǻẚặắằẳẵȃȃậậấấấẫẩẩẩẩẩẩẩẩảảảảảảả ȧ Ǡ ǡ Ạ ạ Ä ä Ǟ ǟ À à ş ȁ Á á Ā ā Ā̀ ā̀ Ã ã Ą ± Ą́ ± Ą̃ ą̃ A̲ a̲ ᶏ...

问题是 Flutter 无法区分这三种形式,所以在 Unicode 中,如果您打印结果,您将得到相同的数字 [1605,1605,1605],所以相同的单词 'ممم',在 Unicode 中它应该是 [65251,65252,65250]

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  String flipText() {
    var myWord = 'ممم';
    var myWordToRunes = myWord.codeUnits.toList();
    var myWordToCodeUnitsReversed = myWordToRunes.reversed.toList();
    var transformCodeUnitsToLetters =
        String.fromCharCodes(myWordToCodeUnitsReversed);
    return '$transformCodeUnitsToLetters';
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SPLIT IT'),
      ),
      body: Center(
        child: Column(
          children: <Widget>[
            Text(
              'FINAL RESULT ﻢﻤﻣ',
              style: TextStyle(fontSize: 43),
            ),
            Container(
              margin: EdgeInsets.all(20),
              child: Text(
                flipText(),
                textDirection: TextDirection.rtl,
                textAlign: TextAlign.center,
                style: TextStyle(fontSize: 43),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

这与 Unicode 无关。它与字体定义有关。所有三个字符都是 U+0645 (م)。在文本呈现期间,字体将针对不同的上下文执行 glyph 替换(而不是 character 替换)。它不会在任何时候将您的数据 (U+0645) 转换为其他 Unicode 代码点(U+FEE3 ﻣ、U+FEE4 ﻤ、U+FEE2 ﻢ)。它只是改变了 U+0645 的绘制方式。

(如果你在编辑器中打开这个 post,你会注意到字体有多重要。在 Stack Overflow 的“显示字体”中,U+FEE3 和 U+FEE4 就我而言是相同的可以分辨,但在“编辑字体”中,它们是相当不同的,至少在 Safari 中是这样。)

您正在寻找的是阿拉伯语演示文稿 Forms-B 转换器,它不是我所知道的任何 Unicode 库的标准部分。我看到的唯一实现是在 Objective-C 中,转换为其他语言应该比较简单,但请注意此代码是在 GPL 下获得许可的。

您可能会找到一个库来为您进行这种转换,但我希望您可能必须自己开发一些东西。我怀疑是否已经编写了原生的 Dart 解决方案。

或者,如果文本是静态的,您可以将演示文稿表单代码点直接嵌入到您的代码中。与其在键盘上键入 meem,不如从 Unicode 代码点列表中复制您想要的确切形式。我个人广泛使用 fileformat.info 或这个。

var myWord = 'ﻣﻤﻢ';
// Typed as: ﻣ ﻤ ﻢ

有关 C++ 的更多讨论,请参阅 Arabic: 'source' Unicode to final display Unicode