FBX를 경유했을 때 깨진 일본어 문자열을 어떻게든
ぃ 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 함수를 사용합니다.
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 함수를 사용합니다.
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루블이야!
참고
ぃ tp // 이 m / FG 타츠로 / ms / f45c349 06d6df95839b
h tp : // 굉장했다. 작은 m/아츠아키/있어 MS/6120일 d2 그림 3C448d774bf
ぃ tp // m / 후지 y / ms / f738 아 9d0 ~ b7427 07 아 4
Reference
이 문제에 관하여(FBX를 경유했을 때 깨진 일본어 문자열을 어떻게든), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/it_ks/items/c2a076d26dc8b75ac141텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)