2019년 9월 30일 월요일

react-native EUC-KR UTF-8 convert

react-native 에서 EUC-KR UTF-8 Convert 에 대해 설명 한다.


  1. 필요 라이브러리
    • rn-fetch-blob
      • react-native 에 fetch 가 내장되어 있으나 blob 형태로 가져올수 없어 자동 convert 중 utf-8 로 변경 됨.
        blob 으로 화면단까지 가져와 처리할수 있도록 해당 라이브러리 사용.
      • yarn add rn-fetch-blob
    • iconv-lite
      • charset converter. 유명한 그것.
      • yarn add iconv-lite
    • buffer
      • 변환 과정에서 buffer  에 담아 변환을 하는데 브라우저에는 내장되어 있으나 react-native 에는 없음.
        이전 작업할때 기억에는 debug 모드로 브라우져 연동시 있는것으로 간주하고 작동 했던 것으로 기억 함.
        하지만 debug 모드 끄면 없다고 오류 뱉음.
      • yarn add buffer
    • base-64
      • base64 encode decode 그것. rn-fetch-blob 의 data 가 base64 로 넘어옴
      • yarn add base-64
  2. 코드
    • request
      1
      2
      3
      4
      5
      6
      7
      8
      9
      makeQuery(obj) {
          var str = [];
          for (var p in obj)
            if (obj.hasOwnProperty(p)) {
              // str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
              str.push(escape(iconv.encode(p, 'EUC-KR').toString('binary')) + "=" + escape(iconv.encode(obj[p], 'EUC-KR').toString('binary')));
            }
          return str.join("&");
        }
      
    • response
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      RNFetchBlob.fetch('POST', this.url,
            {
              'Content-Type': 'application/x-www-form-urlencoded'
              , 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
            }
            , this.makeQuery(param)
          )
          .then((response) => {
            
            if(response.info().status != 200){
              throw new Error('status error');
            }
            let base64Decode = base64.decode(response.data);
          let byteArray = new Uint8Array(base64Decode.length);
          for (var i = 0; i < base64Decode.length; i++) {
            byteArray[i] = base64Decode.codePointAt(i);
          }
      
          let decodedString = iconv.decode(byteArray, 'EUC-KR').toString();
      
          return decodedString;
          })
        }
      
블로그 코드넣기 더럽게 어렵네 ㅡㅡ,

댓글 없음:

댓글 쓰기