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.)