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

libcaca - changing ascii glyphs to Katakana

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

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=

新数组的结果:

/* List of glyphs */
static uint32_t ascii_glyphs[] =
{
    /*
    ' ', '.', ':', ';', 't', '%', 'S', 'X', '@', '8', '?'
    */

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


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

};

是这样的:

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

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

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

所以这些字符打印正确。结果: 但是如果我在十六进制中添加片假名:

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

    /* Katakana (part) */
    0x30a1,0x30a2,0x30a3,0x30a4,0x30a5,0x30a6,0x30a7,0x30a8,0x30a9,0x30aa,
    0x30ab,0x30ac,0x30ad,0x30ae,0x30af,0x30b0,0x30b1,0x30b2,0x30b3,0x30b4
}; 

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

那么为什么这仍然不起作用?看起来像终端(?),gcc(?)或一些不喜欢片假名符号的东西:)

感谢您的指导!

问题是平假名和片假名是fullwidth characters. When Caca tries to write a character to the screen using caca_put_char(),它会检查屏幕上是否已经有全角字符,如果有,它会用space替换一部分。由于屏幕上所有可能的字符位置都被写入,它最终会用 space 覆盖任何全角字符,因此最终没有片假名可见。

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