为何存储在AsyncStorage中的字符串取出后会变为乱码值?
为何存储在AsyncStorage中的字符串取出后会变为乱码值?
嘿,我来帮你捋捋这个AsyncStorage存完取出来变乱码的问题~ 这种情况大概率是这几个常见原因搞的鬼,咱们一个个说:
- 编码不匹配:AsyncStorage默认是按UTF-8格式存储字符串的,要是你存之前把字符串转成了其他编码的二进制数据再转成字符串,或者取的时候用错了解析编码,那结果肯定是乱码。一定要保证存和取的编码统一,就用默认的UTF-8就好。
- 没正确序列化非字符串数据:要是你存的不是纯字符串(比如对象、数字这类),直接存的话会自动调用它的
toString()方法,存进去的就不是你预期的内容,取出来自然像乱码。比如要存对象的话,得先用JSON.stringify()转成JSON字符串,取的时候再用JSON.parse()转回来。 - 异步操作没等完成就读取:AsyncStorage的所有操作都是异步的,如果你刚调用
setItem就立刻getItem,这时候存储操作可能还没完成,取到的要么是空值,要么是不完整的旧数据,看起来就像乱码。一定要用async/await或者.then()等存储操作完成后再读取。 - 存储内容混入了不可见字符:有时候可能是你要存的字符串里不小心混入了换行、制表符这类不可见字符,或者在处理字符串的时候不小心拼接了错误的内容,导致取出来的字符串结构异常。
结合你给出的代码片段,给你调整下handleButtonClick的写法,确保存储和读取都正确:
// Selected radio button value const [value, setValue] = React.useState('first'); // Default lang const [defaultLang, setDefaultLang] = useState(''); const handleButtonClick = async () => { // 先确定要存储的语言字符串 const targetLang = value === 'first' ? 'zh-CN' : 'en-US'; try { // 等待存储操作完成 await AsyncStorage.setItem('defaultLang', targetLang); // 存储完成后再读取 const savedLang = await AsyncStorage.getItem('defaultLang'); setDefaultLang(savedLang); } catch (error) { console.log('存储或读取时出错:', error); } };
你可以按照这个思路一步步排查,先从异步操作和序列化这两个最常见的问题入手,应该很快就能解决啦~
内容来源于stack exchange
相关产品推荐
相关产品推荐

