【问题标题】:How do I match non-ASCII characters with RegexKitLite?如何将非 ASCII 字符与 RegexKitLite 匹配?
【发布时间】:2009-12-08 21:43:04
【问题描述】:

我正在使用 RegexKitLite,我正在尝试匹配一个模式。
以下正则表达式模式无法捕获包含带有标题的 N 的单词:ñ。 我缺少字符串转换吗?

subjectString = @"define_añadir";
//regexString = @"^define_(.*)"; //this pattern does not match, so I assume to add the ñ     
//regexString = @"^define_([.ñ]*)"; //tried this pattern first with a range
regexString = @"^define_((?:\\w|ñ)*)"; //tried second

NSString *captured= [subjectString stringByMatching:regexString capture:1L];
//I want captured == añadir

【问题讨论】:

    标签: objective-c regex iphone cocoa-touch nsstring


    【解决方案1】:

    对我来说似乎是一个编码问题。您将源代码保存在无法处理该字符的编码(如 ASCII)中,或者编译器使用错误的编码来读取源文件。回到原来的正则表达式,尝试像这样创建主题字符串:

    subjectString = @"define_a\xC3\xB1adir";
    

    或者这个:

    subjectString = @"define_a\u00F1adir";
    

    如果可行,请检查源代码文件的编码并确保它与编译器期望的编码相同。

    编辑:我从未使用过 iPhone 技术堆栈,但根据 this doc,您应该使用 stringWithUTF8String 方法来创建 NSString,而不是 @"" 文字语法。事实上,它说你永远不应该在你的代码中使用非 ASCII 字符(即任何不在0x00..0x7F 范围内的字符);这样您就不必担心源文件的编码。无论您使用什么语言或工具集,这都是很好的建议。

    【讨论】:

    • 更正:我发布的示例确实有效 - 我简化了代码以使其易于阅读,但我可能有更多线索......我的源代码文件 .m 是 UTF8。我用 unix 命令file 检查。这些字符串值实际上是从 HTML 文件中读取的,这些文件也是 UTF8 格式的。我已经用 NSLog 打印出文件内容以显示“xn--define_aadir-hhb”,我希望从 HTML 中将“define_añadir”读取到 subjectString 中。正如您提到的艾伦,我可以在哪里检查编译器期望的编码?此外,并非我找到的所有源文件都是 UTF8,有些是 ASCII。这可能是个问题吗?
    • ASCII 是 UTF-8 的子集,因此每个 ASCII 文件也是一个 UTF-8 文件。至于其余的,请参阅我的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2011-01-08
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多