You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何存储在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 13:03:11