UTF-8 비호환 장치용 바이너리 자산으로 JSON 문자열 모음 변환
This article originally appeared on my personal dev blog.
지난 번에 . 이번 주에는 SE Basic IV 프로젝트가 Weblate에서 JSON 출력을 가져와서 인터프리터가 8비트 코드 페이지와 함께 사용할 수 있는 바이너리로 변환하는 방법을 보여드리겠습니다. 이것은 매우 틈새 사용 사례이지만 자신의 프로젝트에 적용할 수 있는 몇 가지 일반적인 교훈이 있기를 바랍니다.
이 프로젝트는 GitHub에서 호스팅되는 Git 리포지토리를 사용합니다. 최상위 수준에는 다른 언어 파일을 생성하는 데 사용되는 영어 JSON 템플릿이 포함된
locales 폴더가 있습니다. 이러한 파일은 명확성이 필요한 경우(예: 라틴 아메리카 스페인어)를 제외하고 대부분 2자로 된 ISO 언어 코드로 식별됩니다.다음은 템플릿의 스니펫입니다.
{
"NAME": "English",
"FILENAME": "EN.LN",
"ICONV": "IBM437",
"SCROLL": "Scroll?____",
"ERROR": " in ",
"READY": "Ready_______",
"SYNTAX": "Syntax error",
...
"PATH": "Path not found"
}
`
NAME 필드는 웨블레이트와 빌드 스크립트(보고용)에서 사용됩니다.FILENAME 필드는 출력 파일 이름을 설정합니다.ICONV 필드는 UTF-8에서 변환할 때 사용할 코드 페이지를 설정합니다.처음 세 개의 번역 가능한 용어에는 밑줄 형식의 패딩이 포함되어 있습니다. 이는 통역사가 이러한 용어가 고정된 주소에 저장될 것으로 예상하기 때문에 필요합니다. 빌드 스크립트는 밑줄을 null로 변환합니다(코드 포인트
0 ). 나머지 용어는 null로 종료됩니다.JSON 파일의 항목은 임의의 순서일 수 있습니다. 빌드 스크립트는 필요한 순서대로 출력합니다.
기본 분기의
locales 폴더에 변경 사항이 있으면 GitHub 호스팅 러너를 시작하여 빌드 스크립트를 실행하는 GitHub 작업이 트리거됩니다. 작업은 YAML 파일에 정의됩니다.`
name: build localized message bundles
on:
push:
paths:
- 'locales/**'
workflow_dispatch:
jobs:
locales:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name:
run: |
./scripts/locales.sh
git config user.name github-actions
git config user.email [email protected]
git add .
git commit -m "locales"
git push origin main
`
The name 매개변수는 보고 목적으로 사용됩니다.
on 매개변수는 스크립트가 실행될 때 설정됩니다. 이 경우 ** 폴더에 모든 파일 유형( locales )의 푸시가 있는 경우입니다. 분기를 지정하지 않으면 스크립트는 기본 분기로 기본 설정됩니다. workflow_dispatch 매개변수를 사용하면 GitHub Actions 웹 인터페이스에서 스크립트를 수동으로 실행할 수 있습니다.
jobs 매개변수는 작업이 수행하는 작업을 정의합니다. 여기서 locales는 작업 이름입니다.
runs-on 매개변수는 호스트 실행기가 사용하는 OS를 설정합니다. 이 경우 Ubuntu 최신(x64)입니다. 다른 OS를 지정할 수도 있지만 실행 프로그램 비용을 지불해야 하는 경우(예: 상용 소프트웨어를 개발하는 경우) Linux가 가장 저렴한 옵션입니다.
steps 매개변수는 작업을 정의합니다. uses 매개변수를 사용하면 checkout@v2와 같은 미리 정의된 작업을 사용할 수 있습니다. 그러면 호스트 실행기에 리포지토리 사본이 저장됩니다.
run: | 매개변수를 사용하면 명령줄 작업 목록을 지정할 수 있습니다. 이 작업은 다음 작업을 수행합니다.
locales.sh 셸 스크립트를 실행합니다. Git user.name 및 user.email을 설정합니다. 이는 작업에 의해 변경되었음을 보여줍니다. 모든 변경 사항을 추가합니다. 변경 사항을 커밋합니다. 변경 사항을 푸시합니다.
다음은 locales.sh 스크립트의 스니펫입니다.
cd locales
for f in *.json; do
export jname=${f%}
name=$(jq -r .NAME $jname)
echo Generating $name
fname=$(jq -r .FILENAME $jname)
iconv=$(jq -r .ICONV $jname)
scroll=$(jq -r .SCROLL $jname)
error=$(jq -r .ERROR $jname)
ready=$(jq -r .READY $jname)
synatx=$(jq -r .SYNTAX $jname)
...
path=$(jq -r .PATH $jname)
echo $scroll"_"$error"_"$ready"_"$ok"_"$break"_"$for"_"$synatx"_"$gosub"_"$data"_"$call"_"$overflow"_"$memory"_"$line"_"$subscript"_"$variable"_"$address"_"$statement"_"$type"_"$screen"_"$device"_"$stream"_"$channel"_"$function"_"$buffer"_"$next"_"$wend"_"$while"_"$file"_"$input"_"$path"____________________________________________________________________________________________________________________________________________________________________________________________________________________" > TEMP.LN
iconv -f UTF8 -t $iconv TEMP.LN > $fname
head -c 608 $fname > TEMP.LN
mv TEMP.LN $fname
perl -pi -e 's/_/\0/g' $fname
mv $fname ../ChloeVM.app/Contents/Resources/chloehd/SYSTEM/LANGUAGE.S/$fname
done
The script uses a FOR loop to iterate through every JSON file in the locales 폴더. 대부분의 실제 작업은 두 가지 도구로 수행됩니다.
jq - 명령줄 JSON 프로세서
iconv - 명령줄 문자 인코딩 도구입니다.
JSON 파일의 각 매개변수에 대해 스크립트는 jq를 사용하여 동등한 변수를 생성합니다. 각 파일에 대한 프로세스는 다음과 같습니다.
모든 변수가 할당되면 추가 패딩이 있는 TEMP.LN라는 임시 파일이 생성됩니다. 그런 다음 iconv를 사용하여 임시 파일을 적절한 코드 페이지용으로 인코딩된 올바른 파일 이름으로 변환합니다. head 명령은 바이너리를 고정 길이로 트리밍하는 데 사용됩니다. 임시 파일이 제거되었습니다. Perl은 밑줄( _ )을 null 문자(코드 포인트 0 )로 바꾸는 데 사용됩니다. 바이너리가 기본 파일 시스템의 올바른 위치로 이동됩니다.
Reference
이 문제에 관하여(UTF-8 비호환 장치용 바이너리 자산으로 JSON 문자열 모음 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/aowen/converting-json-string-collections-to-binary-assets-for-non-utf-8-compliant-devices-57pl
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)