GMS自定义GSON读写文件时字符串长度异常问题求助
排查GMS文件读写后GSON字符串多出隐形字符的问题
常见原因及解决步骤
1. 文本模式读写的换行符/编码转换问题
GMS的文本文件读写函数(如file_text_write_string/file_text_read_string)会自动处理换行符(Windows下将\n转为\r\n),或默认添加UTF-8 BOM头,导致读取后字符串多出隐形字符。
排查动作
对比直接生成的字符串与读取后的字符串长度:
var direct_str = gsonStringifySelf(); show_debug_message("直接生成长度:" + string(string_length(direct_str))); // 写入再读取 var file = file_text_open_write("test.gson"); file_text_write_string(file, direct_str); file_text_close(file); var file_read = file_text_open_read("test.gson"); var file_str = file_text_read_string(file_read); file_text_close(file_read); show_debug_message("读取后长度:" + string(string_length(file_str)));
如果长度差1,大概率是多了换行符;差3则是UTF-8 BOM头导致。
解决方法
- 若为换行符:读取后修剪首尾控制字符
file_str = string_trim(file_str); // 或精准移除末尾换行 while string_length(file_str) > 0 and (string_char_at(file_str, string_length(file_str)) == "\n" or string_char_at(file_str, string_length(file_str)) == "\r") { file_str = string_copy(file_str, 1, string_length(file_str) - 1); }
- 若为UTF-8 BOM:读取后移除开头BOM
var bom = chr(239) + chr(187) + chr(191); if string_length(file_str) >= 3 and string_copy(file_str, 1, 3) == bom { file_str = string_copy(file_str, 4, string_length(file_str) - 3); }
2. 改用二进制读写规避文本转换
二进制读写会完全保留原始字符串,不会添加任何额外字符,是最稳妥的方案:
- 写入代码:
var save_str = gsonStringifySelf(); var file = file_bin_open("level_data.gson", 1); // 1 = 写入模式 file_bin_write_string(file, save_str); file_bin_close(file);
- 读取代码:
var file = file_bin_open("level_data.gson", 0); // 0 = 读取模式 var str_length = file_bin_size(file); var load_str = file_bin_read_string(file, str_length); file_bin_close(file);
3. 检查自定义GSON序列化函数的隐性输出
确认gsonStringifySelf()生成的字符串是否本身包含不可见字符(如空字符\0),只是内存解析时被忽略。可以输出每个字符的ASCII码排查:
var str = gsonStringifySelf(); for(var i=1; i<=string_length(str); i++){ show_debug_message("位置" + string(i) + ": " + string(ord(string_char_at(str, i)))); }
对比读取后字符串的ASCII码,定位差异字符。
内容的提问来源于stack exchange,提问作者Majestic_Monkey_
相关产品推荐
相关产品推荐

