2017-04-05 61 views
0

我試圖在OSX和GNU/Linux上將十六進制值打印到unicode emojis無法在Mac OSX上將十六進制值(emojis)打印到unicode

我曾嘗試(例如)\U1f600'\U1f600'"\U1f600",他們都運作良好在GNU/Linux與echo -e命令,但在OSX不會在所有的工作,只打印原始的十六進制值回。我也試過printf命令,但它也只能在GNU/Linux上運行。

我該如何使它在OS X上工作?

回答

2

安裝新bash。 :)

OSX中的默認bash是陳舊的3.2.57(1)-release。這是因爲在4.0中將bash的許可證從GPL v2更改爲GPL v3,所以Apple無法將其包含到他的OS分區中。

E.g.使用使用的bash從macports.org

$ echo $BASH_VERSION 
4.4.12(1)-release 
$ echo -e '\U1f600' 

$ printf "%b\n" "\U1f600" 

編輯默認/bin/bash

$ echo $BASH_VERSION 
3.2.57(1)-release 

$ echo -e '\U1f600' 
\U1f600 
$ printf "%b\n" "\U1f600" 
\U1f600 

: 你可以使用Perl:

perl -CO -E 'say chr 0x1f600' 
#or 
perl -CO -E 'say pack 'U', 0x1f600' 
#or 
perl -CO -E 'say "\N{U+1F600}"' 

所有打印


EDIT2:

emo="\N{U+1F604}" 
perl -CO -E "say qq{$emo}" #use double quotes, but isn't a good practice 

更好,這將直接接受你\u序列......

perl -CO -plE 's/\\u(\p{Hex}+)/chr(hex($1))/xieg' <<< "your string" 

如:

emo='some \U1f600 and another \U1f608 here' 
perl -CO -pE 's/\\u(\p{Hex}+)/chr(hex($1))/xieg' <<< "$emo" 

打印

some and another here 
+0

謝謝您的回答,有沒有一種方法,使之與「古老」的版本工作? – Grender

+0

好吧,我正在做'perl -CO -E'在bash腳本里面說'$ emojified',但它沒有顯示任何東西。 (從$ values [0] =「\ N {U + 1f600}」中獲得$ emojified的值,我認爲這個問題依賴於''''的需要,你能幫我嗎?我也試過轉義' 「'like like:'values [0] =」\「\ N {U + 1f600} \」「' – Grender

+0

@Grender增加了一些例子 – jm666

0

的函數的chr_utf8_mGreg's Wiki: Wooledge.org BashFAQ N 071工作自bash 3.1

它執行手動utf8編碼。

你最好看看那裏,因爲完整的腳本很長。

一個簡單的版本,所以你得到的功能懸掛是:

#!/bin/bash 

chr() { 
    local val 
    [ "$1" -lt 256 ] || return 1 
    printf -v val %o "$1"; printf "\\$val" 
    # That one requires bash 3.1 or above. 
    } 

ord() { 
    # POSIX 
    LC_CTYPE=C printf %d "'$1" 
} 

# examples: 
chr "$(ord A)" # -> A 
ord "$(chr 65)" # -> 65