GML中巴西葡萄牙语特殊字符归一化的更优实现方案咨询
解决方案:简化巴西葡语字符串归一化的实现
针对你遇到的string_lower()无法处理带重音大写字符(如Á)、手动维护字符数组冗余的问题,推荐两种更优的实现方式:
方法1:Unicode规范化(推荐,GameMaker Studio 2.3+适用)
利用Unicode的NFD(规范分解)格式,将带重音的字符拆分为基础字符+重音标记,再移除重音标记,无需手动维护字符映射:
function string_normalize(str) { // 统一转换为小写(GMS 2.3+的string_lower已支持Unicode字符) str = string_lower(str); // 将字符串转换为NFD规范形式,拆分重音与基础字符 str = string_utf8_normalize(str, "NFD"); // 移除所有Unicode重音标记(U+0300至U+036F范围) str = string_replace_all_regex(str, "[\\x{0300}-\\x{036F}]", ""); return str; }
优势:
- 无需手动维护重音字符数组,避免遗漏或冗余
- 自动支持所有带重音的Unicode字符,覆盖巴西葡语全部特殊字符(如
Á、Ã、Ç等) - 代码简洁,扩展性强,后续无需因新增字符修改代码
方法2:优化字符映射(兼容旧版GameMaker)
若使用旧版本GameMaker,无法使用Unicode规范化函数,可先统一处理大写带重音字符的转换,再替换重音:
function string_normalize(str) { // 定义大写重音字符与对应小写、基础字符的映射 var upper_accents = ["À","Á","Â","Ã","Ä","È","É","Ê","Ë","Ì","Í","Î","Ï","Ò","Ó","Ô","Õ","Ö","Ù","Ú","Û","Ü","Ç"]; var lower_accents = ["à","á","â","ã","ä","è","é","ê","ë","ì","í","î","ï","ò","ó","ô","õ","ö","ù","ú","û","ü","ç"]; var simple_chars = ["a","a","a","a","a","e","e","e","e","i","i","i","i","o","o","o","o","o","u","u","u","u","c"]; // 先将大写重音字符转为小写 for (var i = 0; i < array_length(upper_accents); i++) { str = string_replace_all(str, upper_accents[i], lower_accents[i]); } // 转换剩余普通大写字符为小写 str = string_lower(str); // 替换小写重音字符为基础字符 for (var i = 0; i < array_length(lower_accents); i++) { str = string_replace_all(str, lower_accents[i], simple_chars[i]); } return str; }
优势:
- 解决了原函数中
string_lower()无法处理带重音大写的问题 - 仅需维护一套映射关系,避免重复定义冗余的字符数组
内容的提问来源于stack exchange,提问作者Leocruz
相关产品推荐
相关产品推荐

