{getopts}{応付子}{仕類即譜}=}(3)

{W応付子に対する=を含んだ指定子の解析 K#9-D657/A-2802}

$ somecmd ... -Wwopt=val ...
みたいなのの解析をしたい

変数はできるだけ使わない。

#!/bin/sh

set -o errexit; set -o nounset; set -o noclobber
umask 0027
# shellcheck disable=SC2155
export PATH="$(command -p getconf PATH)${PATH:+:$PATH}"
export POSIXLY_CORRECT='200809' UNIX_STD='2003' \
       COMMAND_MODE='unix2003' XPG_SUS_ENV='ON'

OPTIND=1; while getopts 'abo:W:' OPTSTR; do
	case "$OPTSTR" in
		'W')
			case "$OPTARG" in
				'wopt='*)
					shift
					set -- "$@" "${OPTARG#wopt=}"
					OPTIND="$(($OPTIND - 1))"
					continue
					;;
				*)
					echo "error in -W!"; exit 1
					;;
			esac
			;;
		'a'|'b'|'o')
			echo "opt a/b/o!"
			;;
	esac
done; shift $(($OPTIND - 1))
echo "remind argv: $@"

exit 0
$ /tmp/Wopt.sh -a -o arg -Wwopt=a/b -a -o a A B
opt a/b/o!
opt a/b/o!
opt a/b/o!
opt a/b/o!
remind argv: A B a/b

なぜうまくいくか不明。
というか,なぜOPTIND変数をsetの後に持ってくる必要があるのかが分からん。

=}
{可搬運用機構界面}{用類}=}(2)
{POSIX仕類即譜によるUTF-8復号・符号化}{sed}=}(2)

{u8get.shの実装の記録 K#9-D657/A-B101}

https://gitlab.com/-/snippets/2144894

出力

『Unicode 13.0』補遺A「記法の規約/符号位置」にあるとおり,U+%06Xにするか?
printf 'U+%06X'という形式にすると,printfが組込み命令だった場合に処理を効率化できる。printfの実行を一度に抑えられるから。

名称

u8get.shにする? ICUC言語束縛において,(任意の)バイト列をUTF-8符号と看做してUnicode符号位置に変換する幕令名はU8_GET

  • 「符号化」?「復号」?

→たぶん「符号化」。「符号化された文字」が「絶対文字?から符号位置への写像」と定義されているので。

異了処理

符号化できないもの

U+FFFDにする?
 ←参考: 『Unicode 13.0』5.22節「変換時におけるU+FFFD置換

(UTF-8などの)符号化にあたって各実装が従うべき事柄: 『Unicode 13.0』3.9節「Unicode符号化形式/変換工程における制約

異常入力をsedとかで適切に取り扱えるようにsedの冒頭バイト判定時に空行を適切な数だけ足す。
こうすると非整形式UTF-8バイト列のうち,あるべきバイトが無いようなものに対してもN命令が失敗しない(だからその後のs命令,t命令で異了を扱える)。

利用者界面

  • -W応付子でiconv用類を使った実装に切り替え? u8get.sh -Wuseiconvとか?

→iconv用類の変換形式は-Wuseiconv=UTF8/UCS4みたいな。
たぶんこっちが使える場合はsedを用いた方法よりも早いはず。

  • 「異了処理をしない」応付子をiconvのそれと合わせる?-c?意味的にどうなんだ?
=}
{ICU}{Unicode}{ICU}=}(3)
{}