detencode -- van ilyen?

 ( NevemTeve | 2016. július 29., péntek - 14:48 )

Biztos van már ilyesmi, arról lenne szó, hogy egy kis program beleolvas egy forrásprogramba, és az első pár sorban olyasmi kommentet keres, hogy encoding="valami" vagy encode: másvalami
Kicsit értelmesebben:

$ head Foo.java
/* Foo.java encoding="ISO-8859-2" */
$ detencode Foo.java
ISO-8859-2
$ javac -encoding $(detencode Foo.java) Foo.java

Persze ha nem talál ilyen kommentet, akkor megprólbálhat utf8 validságot ellenőrizni, vagy a LC_CTYPE-ból kiindulni (bár jobban belegondolva ez elég hülye ötletnek hangzik: valaki valahol valamikor írt előállított egy forrásprogramot valamilyen kódolással, de mi köze annak ahhoz, hogy itt és most az én terminálemulátorom hogy van beállítva?)

20160802.1810: Na itt a prealfa-verzió, használat:

$ head -n1 detencode.c
/* detencode.c; encoding=ISO-8859-2 */

$ gcc -o detencode \
    -finput-charset=$(./detencode -d -default detect,getenv,ISO-8859-2 detencode.c) \
    detencode.c
detencode detencode.c: ISO-8859-2 [from line 1]

$ ./detencode -d -d -default detect dettest.txt
UTF-8
detencode dettest.txt: UTF-8 [from=detect]
./detencode: stat of 'dettest.txt': n=104 n7=32 n8=72 utf8_ok=36 utf8_err=0

$ ./detencode -h
usage: ./detencode [options] - <filename>
options:
    -h	this help
    -d	increase debuglevel
    -default <value>
	character-set name or special value 'detect' or 'getenv'
	'detect' means checking utf-8 validity (not very reliable)
	'getenv' means trying LC_ALL, LC_CTYPE, LANG (in this order)
	it can be a list, too, eg:
    -default ISO-8859-1
    -default detect,getenv,ISO-8859-2

A stdout-ra kerül a talált/felismert kódolás, a stderr-re pedig a hiba/debug.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

cat $(which detencode)
#! /bin/sh
awk '/encoding="[^"]+"/ { match($0, /encoding="([^"]+)\"/, result); print result[1]; exit; } ' "$1"

És máris van :)

Az ilyen "tippeljünk, hogy UTF-8-e meg nézzünk locale-t" helyett mondjuk lehetne annyival kiegészíteni, hogy adhatsz neki egy formátum stringet/prefixet (fenti példában: -encoding) és azzal együtt írja ki, ha talált valamit, egyébként meg semmit nem ír - így automatikusan az adott szoftvernél, az adott rendszeren default-ra fallbackel.

BlackY
--
"en is amikor bejovok dolgozni, nem egy pc-t [..] kapcsolok be, hanem a mainframe-et..." (sj)

Igen, ilyesmi lesz, csak C-ben. Pythonisták ilyesmit javasolnak: https://www.python.org/dev/peps/pep-0263/