如何始终从 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 获取英文字符串?的主要内容,如果未能解决你的问题,请参考以下文章