2009-02-11 37 views
146

我試圖在TextMate中輸入一些UTF-8字符到LaTeX文件中(它的默認編碼是UTF-8),但LaTeX似乎並不理解它們。運行cat my_file.tex在終端中正確顯示字符。運行ls -al顯示我從來沒有見過的:一個「@」由文件清單:(是的,我在使用乳膠\usepackage[utf8]{inputenc}如何確定OSX中的文件編碼?

[email protected] 1 me  users  2021 Feb 11 18:05 my_file.tex 

我發現iconv,但似乎無法告訴我編碼是什麼 - 它只會轉換一次,我知道了。

+0

根據我的經驗,file(1)命令在猜測文件的編碼方面一直很不錯。我不知道它是否足夠聰明,可以使用文件的com.apple.TextEncoding擴展屬性。 – 2016-08-04 03:16:03

回答

32

@表示文件具有與其關聯的擴展文件屬性。您可以使用getxattr()函數查詢它們。

沒有確定的方法來檢測文件的編碼。閱讀this的答案,它解釋了爲什麼。

有一個命令行工具enca,它試圖猜測編碼。你可能想看看它。

+1

我假設OSX將編碼存儲爲元數據。我知道文件內容只是一個比特簇,沒有固有的編碼。 – 2009-02-12 03:15:27

+1

@ JamesA.Rosen像TextEdit這樣的OS X應用程序會將文件編碼存儲爲屬性(名爲「com.apple.TextEncoding」)。這個`@`表示的屬性很可能包含文件編碼屬性。您可以使用命令`xattr -p com.apple.TextEncoding `來查看編碼屬性是否存在。 – bames53 2014-01-15 20:42:52

+1

你能解釋一下如何使用getxattr嗎?我無法使用它。 – MeV 2015-07-08 13:36:53

0

您使用哪種LaTeX?當我使用的teTeX,我不得不手動下載unicode包並加入到我的.tex文件裏:

% UTF-8 stuff 
\usepackage[notipa]{ucs} 
\usepackage[utf8x]{inputenc} 
\usepackage[T1]{fontenc} 

現在,我已經從2008年的texlive包(here)切換到的XeTEX,它是更簡單:

% UTF-8 stuff 
\usepackage{fontspec} 
\usepackage{xunicode} 

至於檢測文件的編碼,您可以用file(1)播放(但它是相當有限的),但像其他人說,這是困難的。

0

檢查編碼的蠻力方法可能只是檢查十六進制編輯器或類似文件中的文件。 (或者寫一個程序來檢查)看看文件中的二進制數據。 UTF-8格式很容易識別。所有的ASCII字符是單字節低於值128(0x80的) 多字節序列遵循wiki article

所示。如果你能找到一個更簡單的方式來獲得一個程序來驗證編碼爲你的模式,這顯然是一條捷徑,但如果一切都失敗了,這可以做到這一點。

4

經典的8位LaTeX非常受限於其中可以使用的UTF8字符;它高度依賴於您正在使用的字體的編碼以及該字體可用的字形。

由於您沒有給出具體示例,因此很難確切地知道問題出在哪裏 - 您是否嘗試使用您的字體沒有的字形或者您是否沒有使用正確的字體首先編碼。

這裏是展示如何少數UTF8字符可以一個LaTeX文檔中使用一個小例子:

\documentclass{article} 
\usepackage[T1]{fontenc} 
\usepackage{lmodern} 
\usepackage[utf8]{inputenc} 
\begin{document} 
‘Héllø—thêrè.’ 
\end{document} 

您可能有更多的運氣與[utf8x]編碼,但稍警告說,它不再支持並且與[utf8]相比有一些特質(據我回憶,這是一段時間,因爲我已經看過它)。但是,如果它能做到這一點,那對你而言就很重要。

3

@符號表示文件有extended attributesxattr file顯示了它具有的屬性,xattr -l file也顯示了屬性值(其可能很大,有時候—嘗試例如xattr /System/Library/Fonts/HelveLTMM以查看存在於資源分叉中的舊式字體)。

2

在終端中鍵入file myfile.tex有時可以使用一系列算法和幻數來告訴您文件的編碼和類型。這是相當有用的,但不要依賴它提供具體或可靠的信息。

A Localizable.strings文件(在本地化的Mac OS X應用程序中找到)通常被報告爲UTF-16 C源文件。

375

在文件命令上使用-I(這是一個大寫字母i)選項似乎顯示文件編碼。

file -I {filename} 
+56

我需要使用-I – Casebash 2010-06-13 08:45:35

+6

此功能似乎無法區分ASCII和UTF-8(看起來它們對於大多數人來說是相同的美國字符,但不是全部,可能會檢測到unicode位) – BadPirate 2010-12-03 20:26:47

+3

這也適用於Linux(例如Ubuntu) – 2011-02-02 16:09:21

12

只需使用:

file -I <filename> 

就是這樣。

52

在Mac OS X中,命令file -I(首都i)會給你適當的字符集,只要你測試的文件包含基本ASCII範圍以外的字符。

例如,如果你進入終端,並使用vi創建一個文件,例如。 vi test.txt 然後插入一些字符幷包含重音字符(嘗試ALT-e後跟e) 然後保存該文件。

他們鍵入file -I text.txt,你應該得到這樣的結果:使用以下命令

test.txt: text/plain; charset=utf-8

20

您也可以從一個文件類型轉換爲另:

iconv -f original_charset -t new_charset originalfile > newfile 

例如

iconv -f utf-16le -t utf-8 file1.txt > file2.txt 
1

Synalyze It!允許所有編碼的ICU library報價比較文本或字節。使用該功能,您通常會立即看到哪個代碼頁適合您的數據。

1

您可以嘗試將文件加載到Firefox窗口,然後轉到查看 - 字符編碼。該文件的編碼類型旁邊應該有一個複選標記。

6

使用file命令和--mime-encoding選項(如file --mime-encoding some_file.txt),而不是-I選項適用於OS X和具有省略MIME類型「text/plain的」額外的好處,這你可能不關心。

0

我很懶。我只是使用崇高的文字來切換編碼。

13
vim -c 'execute "silent !echo " . &fileencoding | q' {filename} 

走樣的地方在我的bash配置

alias vic="vim -c 'execute \"silent !echo \" . &fileencoding | q'" 

,所以我只需要輸入

vic {filename} 

在我的香草OSX優山美地,它產生比 「文件-I」 更精確的結果:

$ file -I pdfs/udocument0.pdf 
pdfs/udocument0.pdf: application/pdf; charset=binary 
$ vic pdfs/udocument0.pdf 
latin1 
$ 
$ file -I pdfs/t0.pdf 
pdfs/t0.pdf: application/pdf; charset=us-ascii 
$ vic pdfs/t0.pdf 
utf-8 
0

I實現了下面的bash腳本,它適用於我。

它首先嚐試從file --mime-encoding返回的編碼iconvutf-8

如果失敗,它會遍歷所有編碼並顯示原始文件和重新編碼文件之間的差異。它跳過產生大差異輸出的編碼(由MAX_DIFF_LINES變量或第二個輸入參數定義的「大」),因爲這些很可能是錯誤的編碼。

如果因使用此腳本而發生「不良事件」,請不要責怪我。那裏有一個rm -f,所以有怪物。我試圖通過在隨機後綴文件上使用它來防止不利影響,但我沒有做出任何承諾。

測試達爾文15.6.0。

#!/bin/bash 

if [[ $# -lt 1 ]] 
then 
    echo "ERROR: need one input argument: file of which the enconding is to be detected." 
    exit 3 
fi 

if [ ! -e "$1" ] 
then 
    echo "ERROR: cannot find file '$1'" 
    exit 3 
fi 

if [[ $# -ge 2 ]] 
then 
    MAX_DIFF_LINES=$2 
else 
    MAX_DIFF_LINES=10 
fi 


#try the easy way 
ENCOD=$(file --mime-encoding $1 | awk '{print $2}') 
#check if this enconding is valid 
iconv -f $ENCOD -t utf-8 $1 &> /dev/null 
if [ $? -eq 0 ] 
then 
    echo $ENCOD 
    exit 0 
fi 

#hard way, need the user to visually check the difference between the original and re-encoded files 
for i in $(iconv -l | awk '{print $1}') 
do 
    SINK=$1.$i.$RANDOM 
    iconv -f $i -t utf-8 $1 2> /dev/null > $SINK 
    if [ $? -eq 0 ] 
    then 
    DIFF=$(diff $1 $SINK) 
    if [ ! -z "$DIFF" ] && [ $(echo "$DIFF" | wc -l) -le $MAX_DIFF_LINES ] 
    then 
     echo "===== $i =====" 
     echo "$DIFF" 
     echo "Does that make sense [N/y]" 
     read $ANSWER 
     if [ "$ANSWER" == "y" ] || [ "$ANSWER" == "Y" ] 
     then 
     echo $i 
     exit 0 
     fi 
    fi 
    fi 
    #clean up re-encoded file 
    rm -f $SINK 
done 

echo "None of the encondings worked. You're stuck." 
exit 3 
相關問題