如何反转给定单词中的阿拉伯字母并保存字母的形式?
How can I reverse Arabic letters in a given word and save the letter's form?
我是 Dart 和 Flutter 的初学者:
假设我想反转这个单词中的阿拉伯字母:'ممم',正如你所看到的,这是一个独特的字母(发音为 m),在一个单词的树位置中具有树形:
- 初始位置rtl:ﻣ
- 中间位置rtl:ﻤ
- 最终位置 rtl : م
最后的结果应该是:ﻢﻤﻣ
由于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
我是 Dart 和 Flutter 的初学者:
假设我想反转这个单词中的阿拉伯字母:'ممم',正如你所看到的,这是一个独特的字母(发音为 m),在一个单词的树位置中具有树形:
- 初始位置rtl:ﻣ
- 中间位置rtl:ﻤ
- 最终位置 rtl : م
最后的结果应该是:ﻢﻤﻣ
由于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