阿拉伯语字符(有效的电源错误)使我的swift iOS应用程序崩溃。如何正确清理输入以避免此问题和相关问题?
导致崩溃的文本如下所示: 错误发生在以下行:阿拉伯语字符(有效的电源错误)使我的swift iOS应用程序崩溃。如何正确清理输入以避免此问题和相关问题?,ios,swift,input,fonts,arabic,Ios,Swift,Input,Fonts,Arabic,导致崩溃的文本如下所示: 错误发生在以下行: let size = CGSize(width: 250, height: DBL_MAX) let font = UIFont.systemFontOfSize(16.0) let attributes = [ NSFontAttributeName:font , NSParagraphStyleAttributeName: paraStyle ] var rect = text.boundingRectWithSize(size, o
let size = CGSize(width: 250, height: DBL_MAX)
let font = UIFont.systemFontOfSize(16.0)
let attributes = [
NSFontAttributeName:font ,
NSParagraphStyleAttributeName: paraStyle
]
var rect = text.boundingRectWithSize(size, options:.UsesLineFragmentOrigin, attributes: attributes, context: nil)
其中文本变量包含输入的字符串
parastyle声明如下:
let paraStyle = NSMutableParagraphStyle()
paraStyle.lineBreakMode = NSLineBreakMode.ByWordWrapping
我最初的想法是,系统字体无法处理这些字符,我需要做一个NSCharacterSet,但我不确定如何禁止会使我的应用程序崩溃的字符,或者使其成为我可以处理这些输入的字符(理想)。我也不想禁止表情符号
谢谢 过滤所有具有相同方向性的字符。不幸的是,我只知道中有这样的API。不是答案,而是一些信息,这可能提供了一种避免这种情况的方法 更新信息来源: 问题不在于阿拉伯字符本身,而在于CoreText如何处理代表它们的unicode,CoreText是一个软件例程库,用于帮助应用程序在屏幕上显示文本 该漏洞导致CoreText访问无效内存,从而迫使操作系统关闭当前运行的程序:该程序可能是您的短信应用程序、终端,或者在通知屏幕的情况下,是操作系统的核心部分 来自Reddit,但这可能并不完全正确: 只有当消息必须缩写为“…”时,它才起作用。这通常位于Messages.app的锁屏和主菜单上 “有效”和“力量”这两个词可以是任何东西,只要它们在两行不同的文字上,这就迫使阿拉伯文本在信息的下方更远,其中一些字母将被替换为“…”
当第一个点替换其中一个阿拉伯字符的一部分(它们需要一个以上的字节来存储)时,就会发生崩溃。通常会进行安全检查以确保未存储一半字符,但无论出于何种原因,此替换都会绕过这些检查。甚至不要尝试。这是操作系统中的一个bug,将被修复。这不是你的问题。如果你试图修复它,你只是在浪费时间。你很可能会引入bug——当你说你“净化”了输入,这意味着你无法处理一些完美的输入 我工作的公司开发了一个多平台的群组视频聊天。 在Crashlytics报告中,我们开始注意到一些用户正在使用这个著名的unicode序列“有效地”跟踪iOS用户。 我们不能坐等苹果解决这个问题 所以,我已经解决了这个问题,这是我得到的最短的崩溃序列:
// unichar representation
unichar crashChars[8] = {1585, 1611, 32, 2403, 32, 2403, 32, 2403};
// string representation
NSString *crashString = @"\u0631\u064b \u0963 \u0963 \u0963"
因此,我决定过滤掉所有包含两个U+0963
”的文本消息ॣ' 符号之间只有一个符号(希望你能破译这个短语)
我的代码来自NSString+Extensions
类别
static const unichar kDangerousSymbol = 2403;
- (BOOL)isDangerousUnicode {
NSUInteger distance = 0;
NSUInteger charactersFound = 0;
for (NSUInteger i = 0; i < self.length; i++) {
unichar character = [self characterAtIndex:i];
if (charactersFound) {
distance++;
}
if (distance > 2) {
charactersFound = 0;
}
if (kDangerousSymbol == character) {
charactersFound++;
}
if (charactersFound > 1 && distance > 0) {
return YES;
}
}
return NO;
}
我不确定是否可以用太多的“devanagari元音符号Vocal ll”来“区分”信息
我愿意接受纠正、建议和批评:)
我希望看到更好的解决方案。我的解决方案是下一类:
static NSString *const CRASH_STRING = @"\u0963h \u0963 \u0963";
@implementation NSString (CONEffectivePower)
- (BOOL)isDangerousStringForCurrentOS
{
if (IS_IOS_7_OR_LESS || IS_IOS_8_4_OR_HIGHER) {
return NO;
}
return [self containsEffectivePowerText];
}
- (BOOL)containsEffectivePowerText
{
return [self containsString:CRASH_STRING];
}
@end
苹果公司表示,他们正在解决这个问题。这并不像对任何角色进行消毒那么简单,这是一个复杂的渲染问题。好吧,但就目前而言,我无能为力?我可以,比如说,禁止任何输入字符“冗" 或"ॣ“?另外,很抱歉没有放图片,我假设堆栈溢出的人足够聪明,可以自己找到它…(在其他网站上很容易找到)编辑:显然,你需要10个信誉点来发布图像,所以不能,但这是过分的。但是在我的应用程序中,没有缩写。它必须是因为单词中断而发生的。可能是单词中断将中间的阿拉伯语字符拆分。这也可能发生在许多字符中,需要两个UTF16代码单元来表示。现在是2021年,看起来他们并没有“有效地”修复它。权力ॣ ॣHॣ ॣ 冗"
static NSString *const CRASH_STRING = @"\u0963h \u0963 \u0963";
@implementation NSString (CONEffectivePower)
- (BOOL)isDangerousStringForCurrentOS
{
if (IS_IOS_7_OR_LESS || IS_IOS_8_4_OR_HIGHER) {
return NO;
}
return [self containsEffectivePowerText];
}
- (BOOL)containsEffectivePowerText
{
return [self containsString:CRASH_STRING];
}
@end