libcaca - 将 ascii 字形更改为片假名

问题描述

我正在创建一个视频效果,它应该看起来像“矩阵”电影,但有点不同(类似“矩阵”的视频输出将与真实视频的更改后的 alpha 通道混合,所以它看起来是一半实数,一半是数字)。我只是使用带有 caca 驱动程序的 mplayer (mplayer -vo caca video.mp4) 以及屏幕录制,然后在其他软件中混合视频。为此,我需要更改文件 dither.c 中的“静态 uint32_t ascii_glyphs[]”数组(来自此处发布的 caca 库的代码https://github.com/cacalabs/libcaca/blob/master/caca/dither.c):{{1 }} 包含所有片假名符号。但问题是它们看起来不可打印。所以视频的终端输出只包含阴影块。我应该说 bash 代码

' ','.',':',';','t','%','S','X','@','8','?'

在我的终端中正常工作(用几个终端程序检查,正确打印),还设置了语言环境:

str123="ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺヽヾヿㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ㌀㌁㌂㌃㌄㌅㌆㌇㌈㌉㌊㌋㌌㌍㌎㌏㌐㌑㌒㌓㌔㌕㌖㌗㌘㌙㌚㌛㌜㌝㌞㌟㌠㌡㌢㌣㌤㌥㌦㌧㌨㌩㌪㌫㌭㌮㌯㌰㌱㌲㌳㌴㌵㌶㌷㌸㌹㌺㌻㌼㌽㌾㌿㍀㍁㍂㍃㍄㍅㍆㍇㍈㍉㍊㍋㍌㍍㍎㍏㍐㍑㍒㍓㍔㍕㍖㍗ヲァィゥェォャュョッアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン"

for i in $(seq 0 ${#str123}); do echo -n "'${str123:i:1}',"; done

以及新数组的结果:

$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=en_US.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=

这是:

Katakana

例如,如果我将这个“静态 uint32_t ascii_glyphs[]”数组更改为包含完整的 ascii 集,则结果为:

Full ascii

更新:我尝试更改“静态 uint32_t ascii_glyphs[]”数组以包含十六进制表示形式的片假名字形,仍然没有结果,但是(!)如果我添加这些多字节字符来设置:

/* List of glyphs */
static uint32_t ascii_glyphs[] =
{
    /*
    ' ','?'
    */

    /*
    ' ','!','"','#','$','&','\'','(',')','*','+',','-','/','0','1','2','3','4','5','6','7','9','<','=','>','?','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','T','U','V','W','Y','Z','[','\\',']','^','_','`','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','u','v','w','x','y','z','{','|','}','~'
    */


    ' ','ァ','ア','ィ','イ','ゥ','ウ','ェ','エ','ォ','オ','カ','ガ','キ','ギ','ク','グ','ケ','ゲ','コ','ゴ','サ','ザ','シ','ジ','ス','ズ','セ','ゼ','ソ','ゾ','タ','ダ','チ','ヂ','ッ','ツ','ヅ','テ','デ','ト','ド','ナ','ニ','ヌ','ネ','ノ','ハ','バ','パ','ヒ','ビ','ピ','フ','ブ','プ','ヘ','ベ','ペ','ホ','ボ','ポ','マ','ミ','ム','メ','モ','ャ','ヤ','ュ','ユ','ョ','ヨ','ラ','リ','ル','レ','ロ','ヮ','ワ','ヰ','ヱ','ヲ','ン','ヴ','ヵ','ヶ','ヷ','ヸ','ヹ','ヺ','ヽ','ヾ','ヿ','ㇰ','ㇱ','ㇲ','ㇳ','ㇴ','ㇵ','ㇶ','ㇷ','ㇸ','ㇹ','ㇺ','ㇻ','ㇼ','ㇽ','ㇾ','ㇿ','㌀','㌁','㌂','㌃','㌄','㌅','㌆','㌇','㌈','㌉','㌊','㌋','㌌','㌍','㌎','㌏','㌐','㌑','㌒','㌓','㌔','㌕','㌖','㌗','㌘','㌙','㌚','㌛','㌜','㌝','㌞','㌟','㌠','㌡','㌢','㌣','㌤','㌥','㌦','㌧','㌨','㌩','㌪','㌫','㌭','㌮','㌯','㌰','㌱','㌲','㌳','㌴','㌵','㌶','㌷','㌸','㌹','㌺','㌻','㌼','㌽','㌾','㌿','㍀','㍁','㍂','㍃','㍄','㍅','㍆','㍇','㍈','㍉','㍊','㍋','㍌','㍍','㍎','㍏','㍐','㍑','㍒','㍓','㍔','㍕','㍖','㍗','ヲ','ァ','ィ','ゥ','ェ','ォ','ャ','ュ','ョ','ッ','ア','イ','ウ','エ','オ','カ','キ','ク','ケ','コ','サ','シ','ス','セ','ソ','タ','チ','ツ','テ','ト','ナ','ニ','ヌ','ネ','ノ','ハ','ヒ','フ','ヘ','ホ','マ','ミ','ム','メ','モ','ヤ','ユ','ヨ','ラ','リ','ル','レ','ロ','ワ','ン','~'

};

所以这些字符被正确打印。结果:

Result

但是如果我在十六进制中添加片假名:

static uint32_t ascii_glyphs[] =
{
    /* CP437 and Box drawing */
    0x2591,0x2592,0x2593,0x2588,0x2584,0x2580,/* ░ ▒ ▓ █ ▄ ▀ */
    0x2500,0x2501,0x2503,0x253c,0x254b,/* ─ ━ │ ┃ ┼ ╋ */
    0x252c,0x2534,0x2533,0x253b,0x2566,0x2569,/* ┬ ┴ ┳ ┻ ╦ ╩ */
    0x2550,0x2551,0x256c,/* ═ ║ ╬ */
    0x2575,0x2577,0x2579,0x257b
};

添加了这么多空白(只有背景和阴影字符,没有字形):

Many blanks

那么为什么这仍然不起作用?看起来不知何故终端(?),gcc(?)或途中的某些东西只是不喜欢片假名符号:)

感谢您的指导!

解决方法

问题是平假名和片假名是fullwidth characters。当 Caca 尝试使用 caca_put_char() 将字符写入屏幕时,它会检查屏幕上是否已经存在全角字符,如果是,它将用空格替换部分字符。由于屏幕上所有可能的字符位置都被写入,它最终会用空格覆盖任何全角字符,因此最终看不到片假名。

我认为您必须修改 Caca 以处理抖动字符集中的全角字符。如果所有字符都是全角,它应该只写入屏幕上的偶数列。如果你有一个混合,它会更复杂,但你可以例如这样做,如果给定位置上已经有一个全角字符,它就不会尝试覆盖它。