FBX를 경유했을 때 깨진 일본어 문자열을 어떻게든

어쨌든 전회(▼)의 계속입니다.
  • 10진수에서 2자리 16진수를 얻고 싶습니다.
    ぃ tp // m / t_ks / ms / 55d43 996860 에다 아 b

  • 장면에 일본어 이름이 붙은 오브젝트가 있을 때,
    FBX로 전달하면 아래와 같은 객체 이름으로 변환됩니다.
    FBXASC229FBXASC137FBXASC141FBXASC233FBXASC171FBXASC1702
    

    oh! Fxxk!!

    머티리얼이나 텍스처, 블렌드 타겟도 마찬가지이므로,
    꽤 가득 이런 것이 연성됩니다.

    어떻게 하고 싶은



    다음과 같이 해 보았습니다.
    from binascii import a2b_hex as a2b
    
    def fbxasc_to_chr( target_str ):
        return_list = []
    
        stock = ''
        for var in target_str.split( 'FBXASC' ):
            # 空だったら無視する
            if not var:
                continue
            # 1文字目がアルファベットだったら対象外 return_listに足して次へ。
            if var[0].isalpha():
                return_list.append(var)
                continue
    
            # 字数が3より多ければ、3文字目までをint変換
            ex_digit = ''
            if len(var)>3:
                ex_digit = var[3:]
                code_int = int(var[:3])
            else:
                code_int = int(var)
    
            stock +=hex( code_int )
            try:
                return_list.append( a2b(stock.replace('0x','')).decode('utf8') )
            except UnicodeDecodeError:
                continue
    
            # decode、appendができたらリセット
            stock = ''
    
            if ex_digit:
                return_list.append(ex_digit)
    
        return ''.join(return_list)
    

    부드럽게 해설



    팍펑 FBX 문자열을 보면, "FBXASC"라는 것이 정기적으로 들어있는 것을 관찰할 수 있습니다

    더 말하면
    FBXASC + 0-255
    

    조합입니다.
    이것을 하나의 단위(1바이트)로서, 몇 줄이 있을 때 문자로서 디코드할 수 있습니다.
    몇 가지는 하나로 성립할 때도 있고, 3개로 성립할 때도 있다는 것입니다.
    꽤 까다롭기 때문에 자세한 것은 UTF-8의 해설 @wikipedia에 맡깁니다만
    htps : // 그럼.ぃきぺぢ아. rg / uki / u TF-8 #. 6.96.87. 5. 아 D. 97. 7. 아 8. 어
    (▲) 이 표에 의하면, 영수 기호는 1, 「동아시아의 여러 문자・전각」은 3,인 것 같습니다.
    제3・제4 수준의 한자의 일부는 4라고 있네요.

    hex



    0-255 그대로는 사용할 수 없기 때문에 16 진수로 고칩니다.
    이것이 서두에서도 언급한, 전회의 기사입니다. hex 함수를 사용하기로 결정했습니다.

    변환 후에는 반드시 0x이 붙습니다만, 이것을, 아스키로부터 바이너리로 변환하기 전에 정리해 제거하고 있습니다.
    〜〜.replace('0x','')
    

    아스키 -> 바이너리 변환



    여기까지는, 아직 「0-9a-f 로 생긴 문자열」입니다.
    이것을 바이너리로 변환합니다.
    binascii 모듈의 a2b_hex 함수를 사용합니다.
  • 19.8. binascii — 바이너리 데이터와 ASCII 데이터 간의 변환
    htps : // / cs. py 응. jp / 3 / b et al. html # 어려운. 아 2b_에 x
    여기에서는 import시에 단적으로 「a2b」로 하고 있습니다.

  • 아스키 -> 바이너리 변환 후에는 decode 메소드 를 사용할 수 있습니다만, 존재하지 않는 번지라면 디코드 에러가 발생합니다.
    이 에러를 주워, 만약 디코드 에러가 일어난다면 다음에 이월해, 연결해 재차 변환, 라고 하는 흐름이 되고 있습니다.

    FBXASC화되지 않은 유쾌한 동료들에 대처



    문자열 전부가 「FBXASC+0-255」가 되어 주면 이야기는 빠릅니다만…

    예를 들면 「.」는 「FBXASC046」에 재기록되어 등장합니다만,
    보통의 영수는 영수 그대로 캐릭터 라인에 섞여 옵니다.
    그래서 단순히 FBXASC로 split했을 뿐이라면, 얻을 수 있는 리스트 안에 「4자리수치(0-255의 폭이 아니게 되어 버린다)」나, 「3자리 + 영문자(hex에 건네주기 전에 int 변환할 수 없음)이 포함됩니다.
    튀어 나온 자리는 ex_digit 라는 변수에 넣고 나중에 연결하기로 했습니다.

    또한 객체 이름이 영숫자로 시작/끝나면 FBXASC에서 split되지 않는 요소가 처음/끝에 얼마나 붙을지 모르기 때문에 뭔가 같아지도록 if로 구분합니다 ( 'A`)

    결과는 뭔가 더있을 것이라고 생각하지 않습니다 (웃음

    그리고 지금 눈치챘습니다만, 이것이라고 원래부터 0-255의 숫자가 포함되어 있었을 경우 반대로 화 버리는 것이 아닐까라는 수수께끼의 걱정이 있습니다-피곤했기 때문에 좋다

    요약



    장면 내에 일본어를 포함한 차량은 전원 시베리아 보내 25루블이야!

    참고


  • Python3에서 문자열을 처리 할 때의 유익
    ぃ tp // 이 m / FG 타츠로 / ms / f45c349 06d6df95839b
  • 16진수 문자열과 문자열 변환
    h tp : // 굉장했다. 작은 m/아츠아키/있어 MS/6120일 d2 그림 3C448d774bf
  • [수정] Python 문자열의 영숫자 판정으로 빠졌습니다.
    ぃ tp // m / 후지 y / ms / f738 아 9d0 ~ b7427 07 아 4
  • 좋은 웹페이지 즐겨찾기