feck:profanities()函数无法识别含扩展ASCII字符文本中的脏话求助
解决feck:profanities无法识别含扩展ASCII字符文本中脏话的问题
问题分析
从调试信息{<<"inqui\351tez de">>, <<"de">>}来看,é是以ISO-8859-1编码的单字节扩展ASCII字符(\351),而feck库可能默认仅按纯ASCII字节流处理文本,多字节/扩展ASCII字符的存在会干扰字符串的匹配或分词逻辑,导致后续的脏话"de"无法被检测到。
解决方案
统一字符编码为UTF-8
feck库大概率对UTF-8编码的支持更好,先将输入的Latin1编码二进制转换为UTF-8后再传入函数:Utf8Text = unicode:characters_to_binary(<<"inqui\351tez de">>, latin1, utf8), feck:profanities(Utf8Text, <<"de">>).规范化扩展ASCII字符
将扩展ASCII字符替换为对应的ASCII近似字符,消除编码差异对匹配的影响:normalize_text(Text) -> % 先转换为NFD规范化形式,拆分重音符号与基础字符 Normalized = unicode:normalize(Text, nfd), % 替换扩展字符为对应ASCII字符 binary:replace(Normalized, <<"é">>, <<"e">>, [global]). % 使用示例 ProcessedText = normalize_text(<<"inqui\351tez de">>), feck:profanities(ProcessedText, <<"de">>).修复feck的字符遍历逻辑
如果上述方法无效,检查feck源码的字符串处理逻辑:若它是按字节而非Unicode字符遍历文本,会导致多字节字符偏移后续匹配位置。修改代码时,将字节遍历改为基于Unicode字符的处理:% 示例:将字节流转为字符列表处理 scan_profanities(Text, Profanity) -> CharList = unicode:characters_to_list(Text), ProfanityList = unicode:characters_to_list(Profanity), string:str(CharList, ProfanityList) =/= 0.手动分词后匹配
绕过feck的内置分词,手动分割文本为单词后逐个检查:check_profanity(Text, Profanity) -> WordList = string:tokens(binary_to_list(Text), " \t\n\r\f\v"), ProfanityStr = binary_to_list(Profanity), lists:any(fun(Word) -> string:str(Word, ProfanityStr) =/= 0 end, WordList).
内容的提问来源于stack exchange,提问作者Hashini Udara
相关产品推荐
相关产品推荐

