如何在 AS3 中的 Tlf 中加载波斯文本文件?

How load Persian Text File in Tlf In AS3?

我有文本文件:file.txt:

1301,你好我的闪电

3001, سلام بر تو باد

在我的加载文本文件代码中是:

var url:URLRequest = new URLRequest("file.txt");
var n=Number;
var loader:URLLoader = new URLLoader();
loader.load(url);
loader.addEventListener(Event.COMPLETE, loaderComplete);
function loaderComplete(e:Event):void
{
 tt.text=loader.data;
 
}

但我的结果是:

1301,你好我的闪电

3001, ÓáÇã ÈÑ Êæ ÈÇÏ

问题在于数据已正确加载(假设您的 .txt 文件已正确编码为 un​​icode 格式。使用记事本 ++ 执行此操作)但您的 TextField 无法呈现特殊的 unicode 文本、波斯语、阿拉伯语或希伯来语。 不幸的是,唯一可用的解决方案是利用 "TLFTextField" 组件,该组件存在于 flash cs5 中,但由于实施笨拙而在以后的版本中被删除。无论如何,虽然有点晚了,但我 post 在这里使用 tlf 的解决方案因为使用 tlf 正确呈现文本可能真的很痛苦,给你:

  • 下载 "textLayout.swc" 和 "tlfruntime.swc"
  • 将这些 SWC 添加到项目库中。
  • 嵌入你的字体,其中包含你的 unicode 语言的符号(在这种情况下你首选的波斯语字体)这非常重要,因为不是每个目标机器都有这种字体,这足以避免获得抗锯齿文本,即使显示文本。
  • 确保您从字体属性的 ActionScript 选项卡中选择了 FTE(DF4)
  • 您必须实例化您的嵌入字体。在下面的代码中,我们已经做到了这一点。假设 embeddedFont 是嵌入字体的 class 名称。
  • 使用以下函数将文本渲染成tlf(注意这不是用flash timeline写的代码,它是用单独的编辑器写的,由flex sdk编译):

</p> <pre><code>import fl.text.TLFTextField; import flash.text.AntiAliasType; import flash.text.engine.FontLookup; import flash.text.Font; import flash.text.TextFieldAutoSize; import flash.utils.getDefinitionByName; import flashx.textLayout.elements.TextFlow; import flashx.textLayout.formats.TextAlign; import flashx.textLayout.formats.TextLayoutFormat; import flashx.textLayout.formats.VerticalAlign; private var _font:Font= new embeddedFont() as Font; /** * Creates a center registered TLFTextField with the given text * @param text targer text * @param layoutFormat an object containing layoutFormat data. something like { textIndent: 8, color: 0xAAAAAA, fontFamily: "tahoma", fontSize: 28, autoSize: "center", antiAliasType: "advanced" } * @param width width of the TLFTextField, auto set if 0 * @param height height of the TLFTextField, auto set if 0 * @return a center registered TLFTextField with the given text */ public function text(text:String, layoutFormat:Object = null, width:int = 0, height:int = 0):TLFTextField { var _txt:TLFTextField = new TLFTextField(); var _layoutFormat:TextLayoutFormat = new TextLayoutFormat(); if (layoutFormat == null) layoutFormat = new Object(); // creating the textfield if (width != 0) _txt.width = width; if (height != 0) _txt.height = height; _txt.selectable = false; _txt.embedFonts = true; _txt.multiline = true; //if either width or height are 0(not passed to function) and the wordWrap is true, autoSize wont work and width or height will be 0 if (width != 0 && height != 0) _txt.wordWrap = true; if (layoutFormat.backgroud != undefined) _txt.background = layoutFormat.backgroud; if (layoutFormat.backgroundColor != undefined) _txt.backgroundColor = layoutFormat.backgroundColor; _txt.autoSize = (layoutFormat.autoSize != undefined)?(layoutFormat.autoSize) : (TextFieldAutoSize.CENTER); _txt.verticalAlign=(layoutFormat.verticalAlign != undefined)?(layoutFormat.verticalAlign) : (VerticalAlign.MIDDLE) _txt.antiAliasType = (layoutFormat.antiAliasType != undefined)?(layoutFormat.antiAliasType) : (AntiAliasType.ADVANCED); // creating layout format _layoutFormat.textAlign = (layoutFormat.textAlign != undefined)?(layoutFormat.textAlign):(TextAlign.CENTER); _layoutFormat.textIndent = (layoutFormat.textIndent != undefined)?(layoutFormat.textIndent) : (8); _layoutFormat.fontLookup = FontLookup.EMBEDDED_CFF; _layoutFormat.color = (layoutFormat.color != undefined)?(layoutFormat.color) : (0xFFFFFF); _layoutFormat.fontFamily = (layoutFormat.fontFamily != undefined)?(layoutFormat.fontFamily) : (_font.fontName); _layoutFormat.fontSize = (layoutFormat.fontSize != undefined)?(layoutFormat.fontSize) : (42); //setting text flow, text and attaching layout format var _textFlow:TextFlow = _txt.textFlow; _textFlow.hostFormat = _layoutFormat; _textFlow.flowComposer.updateAllControllers(); _txt.text = text; return _txt; }

  • 使用此代码获取 TLFTextField 并将其添加到显示:

</p> <pre><code>private var _tlf:TLFTextField = text("سلام", { textIndent: 8, color: 0xAAAAAA, fontSize: 28, autoSize: "center", antiAliasType: "advanced" } ); stage.addChild(_tlf);

请注意,根据我的经验,使用 RTL 语言创建 tlf 文本时会有 100 毫秒的延迟。确保您在正确的时间创建所有文本(当没有动画、音频或视频打开时),否则您会出现轻微的停顿,足以破坏您的用户体验。