如何始终从 NSError 获取英文字符串?

Posted

技术标签:

【中文标题】如何始终从 NSError 获取英文字符串?【英文标题】:How to always get english string from NSError? 【发布时间】:2019-07-23 01:21:30 【问题描述】:

我有一个使用纯英文字符串设计的 ios 应用程序。在使用另一种语言进行显示的 iOS 设备上运行时(即 Settings/General/Language/iPhoneLanguage 是非英语的)我还想以英语显示系统错误,因为我的字体无法显示非英语字符瞬间。

有没有办法总是从 NSError 获取英文错误信息?或者以某种方式手动查找系统中的英文错误字符串?

【问题讨论】:

您是否在应用中使用本地化? 它只有英文,我正在尝试找到一种从操作系统获取英文字符串的方法,所以显而易见的答案是否定的......但我怀疑你在问别的问题? 【参考方案1】:

在四处挖掘之后,我发现了一个潜在的解决方法。

首先,事实证明,在 大多数 情况下,当我在区域设置为法国的系统上运行时,iOS 会从 [myNSError localizedDescription] 返回英文字符串,并且语言设置为,比如法语。我相信这是因为我在 info.plist 中将 CFBundleDevelopmentRegion 设置为“en”。这就是我想要发生的事情,因为我正在尝试构建一个在任何地方(目前)完全用英语运行的应用程序。

但是,在某些 情况下,例如,如果您尝试在应用程序中购买东西并且网络关闭(这是我最可靠的重现案例),我会收到返回本地化错误的 NSErrors来自[myNSError localizedDescription]。在这种情况下:"Connexion à l’iTunes Store impossible."

当我收到这样的错误时,一种可行的解决方法是使用原始域和错误代码手动创建 NSError。如果你再向它询问localizedDescription,它会给你一个英文的,但它似乎更笼统。在这种情况下:"The operation couldn’t be completed."。似乎正在发生的事情是系统正在使用本地语言填写更详细的错误。

string GetEnglishLocalizedDescription(NSError *originalError)

    if(originalError == nil)
    
        return "";
    
    else
    
        NSString *originalNSErrorString = [originalError localizedDescription];
        string originalUtf8String = originalNSErrorString == nil ? "" : [originalNSErrorString UTF8String];

        // If we have a character outside of the US Ascii range
        // Our font won't display it properly and this is probably
        // a localized description
        // https://tools.ietf.org/html/rfc3629
        bool isUSAscii = true;
        for(uint8_t c : originalUtf8String)
        
            if(c > 0x7F)
            
                isUSAscii = false;
                break;
            
        

        if(!isUSAscii)
        
            // Has non-US Ascii characters, probably localized, get the standard error instead
            NSString *englishNSErrorString = [[NSError errorWithDomain:originalError.domain code:originalError.code userInfo:nil] localizedDescription];
            string englishUtf8String = englishNSErrorString == nil ? "" : [englishNSErrorString UTF8String];

            return englishUtf8String;
        
        else
        
            return originalUtf8String;
        
    

然后,诀窍是弄清楚何时要执行此操作,因为您无法以明显的方式真正判断您在本地语言中遇到了错误。就我而言,我可以只查找我的字体无法显示的字符并进行转换。如果我的字体 can 显示它,我想我可以显示它,因为: a)它是英文的,整个应用程序并不令人惊讶或 b)它实际上是本地化的,恰好是一个字符串,其中的字符都是英文字符。在这种情况下,大概用户将能够以他们的本地语言阅读它。

使用上述代码/算法的最后一个问题:事实证明,Apple 使用的英文错误消息不符合正常的 ASCII 字符集。他们将在 Unicode 中使用花哨的撇号,而不是 ASCII “'”。因此,上面的代码会认为这是一条“本地化”消息。不清楚他们用什么其他角色来做这件事。所以这并不是一个完整的解决方案。它确实解决了“我如何始终检索英文错误消息”的原始问题,但它并没有完全解决我的问题,因为我不知道如何构建一个甚至可以显示所有英文错误消息的字体。叹息。

仍然必须在这里决定最好的方法,但它是一些东西。

【讨论】:

以上是关于如何始终从 NSError 获取英文字符串?的主要内容,如果未能解决你的问题,请参考以下文章

从 NSError 获取部分错误

创建一个 NSError 域

根据预期字符串检查 NSError 描述失败

如何从 NSError 代码中找到错误描述?

如何从 UIWebView 获取内容?

如何强制实体框架始终从数据库中获取更新数据?