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

Posted

技术标签:

【中文标题】libcaca - 将 ascii 字形更改为片假名【英文标题】:libcaca - changing ascii glyphs to Katakana 【发布时间】:2021-07-18 02:16:42 【问题描述】:

我正在创建一个看起来像“矩阵”电影的视频效果,但有点不同(类似“矩阵”的视频输出将与经过更改的 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',
    ':', ';', '<', '=', '>', '?','@',
    'ァ','ア','ィ','イ','ゥ','ウ','ェ','エ','ォ','オ','カ','ガ','キ','ギ',
    'ク','グ','ケ','ゲ','コ','ゴ','サ','ザ','シ','ジ','ス','ズ','セ','ゼ',
    'ソ','ゾ','タ','ダ','チ','ヂ','ッ','ツ','ヅ','テ','デ','ト','ド','ナ',
    'ニ','ヌ','ネ','ノ','ハ','バ','パ','ヒ','ビ','ピ','フ','ブ','プ','ヘ',
    'ベ','ペ','ホ','ボ','ポ','マ','ミ','ム','メ','モ','ャ','ヤ','ュ','ユ',
    'ョ','ヨ','ラ','リ','ル','レ','ロ','ヮ','ワ','ヰ','ヱ','ヲ','ン','ヴ',
    'ヵ','ヶ','ヷ','ヸ','ヹ','ヺ','ヽ','ヾ','ヿ','ㇰ','ㇱ','ㇲ','ㇳ','ㇴ',
    'ㇵ','ㇶ','ㇷ','ㇸ','ㇹ','ㇺ','ㇻ','ㇼ','ㇽ','ㇾ','ㇿ','㌀','㌁','㌂',
    '㌃','㌄','㌅','㌆','㌇','㌈','㌉','㌊','㌋','㌌','㌍','㌎','㌏','㌐',
    '㌑','㌒','㌓','㌔','㌕','㌖','㌗','㌘','㌙','㌚','㌛','㌜','㌝','㌞',
    '㌟','㌠','㌡','㌢','㌣','㌤','㌥','㌦','㌧','㌨','㌩','㌪','㌫','㌭',
    '㌮','㌯','㌰','㌱','㌲','㌳','㌴','㌵','㌶','㌷','㌸','㌹','㌺','㌻',
    '㌼','㌽','㌾','㌿','㍀','㍁','㍂','㍃','㍄','㍅','㍆','㍇','㍈','㍉',
    '㍊','㍋','㍌','㍍','㍎','㍏','㍐','㍑','㍒','㍓','㍔','㍕','㍖','㍗',
    '[', '\\', ']', '^', '_', '`',
    'ヲ','ァ','ィ','ゥ','ェ','ォ','ャ','ュ','ョ','ッ','ア','イ','ウ','エ','オ','カ','キ','ク',
    'ケ','コ','サ','シ','ス','セ','ソ','タ','チ','ツ','テ','ト','ナ','ニ','ヌ','ネ','ノ','ハ',
    'ヒ','フ','ヘ','ホ','マ','ミ','ム','メ','モ','ヤ','ユ','ヨ','ラ','リ','ル','レ','ロ','ワ',
    'ン',
    '', '|', '', '~'

;

这是:

例如,如果我将这个“静态 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(?)或其他东西只是不喜欢片假名符号:)

感谢您的指导!

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

よろこんで。我希望你现在可以让它像你想要的那样工作。 没那么快。 :)

以上是关于libcaca - 将 ascii 字形更改为片假名的主要内容,如果未能解决你的问题,请参考以下文章

之字形页脚更改三角形颜色

是否可以将键更改为 java 中的函数?

将字符串更改为字符串的每个字符中都有字母 a-z 的字符串

如何将 log4cplus 日志文件更改为 utf8

字母转换ascii码

[ffmpeg 扩展第三方库编译系列] 关于 mingw32 下编译libcaca