Cocoa 为什么-[NSTextStorage ReplaceCharactersRange:withAttributedString:]有时不支持其他字符集中的字体?

Cocoa 为什么-[NSTextStorage ReplaceCharactersRange:withAttributedString:]有时不支持其他字符集中的字体?,cocoa,nsattributedstring,Cocoa,Nsattributedstring,我试图诊断UKSyntaxColoredTextDocument 0.4中的一个问题,其中实际使用不同字体的文本在键入时消失。(您可以下载并试用这个很酷的实用程序,亲自查看这个问题…) 以下是背景:这是一些语法着色代码,当您键入时会重新着色。它工作得很好,但如果您输入的某些字符不是该文本视图字体集的一部分(例如摩纳哥、赫尔维蒂卡)。。。例如,一个日文符号字符或其他东西,实际上使用ZapfDingbatsITC或HiraKakuProN-W3等字体来显示它,那么这些字符就不会在您键入时显示 假设您

我试图诊断UKSyntaxColoredTextDocument 0.4中的一个问题,其中实际使用不同字体的文本在键入时消失。(您可以下载并试用这个很酷的实用程序,亲自查看这个问题…)

以下是背景:这是一些语法着色代码,当您键入时会重新着色。它工作得很好,但如果您输入的某些字符不是该文本视图字体集的一部分(例如摩纳哥、赫尔维蒂卡)。。。例如,一个日文符号字符或其他东西,实际上使用ZapfDingbatsITC或HiraKakuProN-W3等字体来显示它,那么这些字符就不会在您键入时显示

假设您有这样的文本:fdsafd[☀]sfds"[☀☀☀][日本語]...

如果将其粘贴到文本字段中,并从弹出窗口中切换语法颜色,将调用
oldrecorrange:
,并使用以下行:

[[textView textStorage] replaceCharactersInRange: range withAttributedString: vString];
在这里,事情按照我的预期进行。ASCII文本、符号和日文文本都是可见的。[textView textStorage]的值从开始到结束都是这样的:(这是gdb的输出;它没有显示unicode字符,不用担心。)


你知道为什么这个方法在一种情况下会以一种方式工作,而在另一种情况下不会工作吗?我是否可以通过某种开关给
NSTextStorage
/
NSAttributedString
一个提示,提示我们希望文本显示外来字符?

尝试[[textView textStorage]fixFontAttributeInRange:range];在[[textView textStorage]ReplaceCharactersRange:range中AttributedString:vString]的范围

我认为问题在于再次编辑文本存储以响应processEditing,这已经是编辑的结尾。-[NSTextStorage processEditing]使用fixFontAttributeInRange:,但是由于您尝试再次编辑,出现了一些问题,修复行为被删除


当您对整个文档执行此操作时,会有一个正常的开始编辑/结束编辑/处理编辑序列,这会使fixFontAttributeInRange:被愉快地调用。

做到了!从文档:“修复aRange中的字体属性,将默认字体分配给脚本中具有非法字体的字符,或者更正字体属性分配。”谢谢! df{ NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33"; }?{ NSFont = "ZapfDingbatsITC 20.00 pt. P [] (0x001ae720) fobj=0x001bb370, spc=5.56"; }fdsafd[{ NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33"; }?{ NSFont = "HiraKakuProN-W3 20.00 pt. P [] (0x001b59e0) fobj=0x001bb600, spc=6.66"; }]sfds[{ ... dffdsafd[?]sfds[???][???] Nihddfdfffdfdd{ NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33"; } dffdsafd[?]sfds[???][???] Nihddfdfffdfddx{ NSFont = "LucidaGrande 20.00 pt. P [] (0x001a3380) fobj=0x001a4970, spc=6.33"; }