سؤال

كنت بحاجة إلى العثور على ترميز جميع الملفات التي يتم وضعها في دليل.هل هناك طريقة للعثور على الترميز المستخدمة ؟

على file القيادة ليست قادرة على القيام بذلك.

الترميز الذي هو من مصلحة لي هو:ISO-8859-1.إذا كان ترميز أي شيء آخر كنت ترغب في نقل الملفات إلى دليل آخر.

هل كانت مفيدة؟

المحلول

ويبدو وكأنه كنت تبحث عن enca. ويمكن أن يخمن وحتى تحويل بين ترميزات. مجرد إلقاء نظرة على رجل .

وأو، إذا تعذر ذلك، استخدام file -i (لينكس) أو file -I (سكس). أن الإرادة الناتج معلومات MIME من نوع لملف، والتي سوف تشمل أيضا ترميز مجموعة الأحرف. لقد وجدت رجل الصفحات للحصول على ذلك أيضا:)

نصائح أخرى

file -bi <file name>

إذا كنت ترغب في القيام بذلك لمجموعة من الملفات

for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done

uchardet - إن مكتبة الترميز للكشف استدار من موزيلا

والاستعمال:

~> uchardet file.java 
UTF-8

والعديد من توزيعات لينكس (ديبيان / أوبونتو، إصدار OpenSuse-البائع المتجول، ...) تقديم الثنائيات.

وهنا هو السيناريو المثال باستخدام -I ملف ويكونف الذي يعمل على ماكوسكس بالنسبة لسؤالك تحتاج إلى استخدام بالسيارات بدلا من يكونف

#!/bin/bash
# 2016-02-08
# check encoding and convert files
for f in *.java
do
  encoding=`file -I $f | cut -f 2 -d";" | cut -f 2 -d=`
  case $encoding in
    iso-8859-1)
    iconv -f iso8859-1 -t utf-8 $f > $f.utf8
    mv $f.utf8 $f
    ;;
  esac
done

ومن الصعب حقا لتحديد ما إذا كان ISO-8859-1. إذا كان لديك نص فقط مع 7 أحرف بت التي يمكن أيضا أن يكون ISO-8859-1 ولكن كنت لا تعرف. إذا كان لديك 8 أحرف قليلا ثم وجود شخصيات المنطقة العليا في ترميزات أجل كذلك. لذلك سيكون لديك لاستخدام القاموس للحصول على تخمين أفضل مما هو عليه، وكلمة من هناك تحديد الحرف الذي يجب أن يكون. وأخيرا إذا اكتشفت أنه قد يكون UTF-8 من كنت متأكدا من أنه ليس ISO-8859-1

وترميز هي واحدة من أصعب الأمور أن تفعل لأنك لا تعرف أبدا إذا كان أي شيء أقول لك

ومع بيثون، يمكنك استخدام وحدة chardet: https://github.com/chardet/chardet

في ديبيان يمكنك أيضا استخدام: encguess:

$ encguess test.txt
test.txt  US-ASCII

وهذا ليس شيئا يمكنك القيام به بطريقة مضمونة. وسيكون أحد الاحتمالات لدراسة كل حرف في الملف للتأكد من أنها لا تحتوي على أية أحرف في 0x00 - 0x1f نطاقات أو 0x7f -0x9f، ولكن كما قلت، وهذا قد يكون صحيحا لأي عدد من الملفات، بما في ذلك متغير واحد آخر على الأقل من ISO8859.

وهناك احتمال آخر هو أن نبحث عن كلمات معينة في الملف في كل من اللغات المعتمدة ومعرفة ما إذا كان يمكنك العثور عليها.

وهكذا، على سبيل المثال، نجد ما يعادل الإنجليزية "و"، "ولكن"، "ب"، "ب" وهلم جرا في جميع اللغات المعتمدة من 8859-1 ومعرفة ما اذا كان لديك عدد كبير من الحوادث داخل الملف.

وأنا لا أتحدث عن الترجمة الحرفية مثل:

English   French
-------   ------
of        de, du
and       et
the       le, la, les

وعلى الرغم من أن هذا ممكن. أنا أتحدث عن الكلمات الشائعة في اللغة الهدف (لجميع وأنا أعلم، الآيسلندية لا يوجد لديه كلمة "و" - كنت ربما لديك لاستخدام كلمتهم ل "الأسماك" [آسف هذا النمطية قليلا، لم أكن يعني أي جريمة، فقط توضيح نقطة]).

إذا كنت تتحدث عن XML ملفات (ISO-8859-1)، و-إعلان XML داخلها يحدد الترميز: <?xml version="1.0" encoding="ISO-8859-1" ?>
لذلك، يمكنك استخدام التعابير العادية (على سبيل المثال مع perl) للتأكد من كل ملف لهذه المواصفات.
ويمكن الاطلاع على مزيد من المعلومات هنا: <لأ href = "http://codesnipers.com/؟q=how-to-determine-text-file-encoding" يختلط = "نوفولو" عنوان = "كيفية تحديد ترميز النص ملف" > كيفية تحديد ترميز ملف نصي .

لتحويل الترميز من 8859 إلى ASCII:

iconv -f ISO_8859-1 -t ASCII filename.txt

وأنا أعلم أنك ترغب في إجابة أكثر عمومية، ولكن ما هو جيد في ASCII هو عادة جيدة في ترميزات أخرى. هنا هو بيثون بطانة واحدة لتحديد ما إذا كان الإدخال القياسي هو ASCII. (وأنا متأكد من هذا يعمل في بايثون 2، ولكن لقد اختبرت فقط على بيثون 3).

python -c 'from sys import exit,stdin;exit()if 128>max(c for l in open(stdin.fileno(),"b") for c in l) else exit("Not ASCII")' < myfile.txt

في سيغوين، وهذا يبدو أنه يعمل بالنسبة لي:

find -type f -name "<FILENAME_GLOB>" | while read <VAR>; do (file -i "$<VAR>"); done

مثال:

find -type f -name "*.txt" | while read file; do (file -i "$file"); done

هل يمكن أن الأنابيب إلى AWK وخلق أمر يكونف لتحويل كل شيء إلى UTF8، من أي ترميز مصدر تدعمها يكونف.

مثال:

find -type f -name "*.txt" | while read file; do (file -i "$file"); done | awk -F[:=] '{print "iconv -f "$3" -t utf8 \""$1"\" > \""$1"_utf8\""}' | bash

ويمكنك استخراج ترميز ملف واحد مع الأمر ملف. لدي ملف sample.html مع:

$ file sample.html 

وsample.html: وثيقة HTML، النص UTF-8 يونيكود، مع خطوط طويلة جدا

$ file -b sample.html

وثيقة HTML، UTF-8 يونيكود النص، مع خطوط طويلة جدا

$ file -bi sample.html

ونص / HTML. محارف = UTF-8

$ file -bi sample.html  | awk -F'=' '{print $2 }'

وUTF-8

أنا باستخدام البرنامج النصي التالي إلى

  1. العثور على جميع الملفات التي تطابق عامل التصفية مع SRC_ENCODING
  2. إنشاء نسخة احتياطية منها
  3. وتحويلها إلى DST_ENCODING
  4. (اختياري) إزالة النسخ الاحتياطي

.

#!/bin/bash -xe

SRC_ENCODING="iso-8859-1"
DST_ENCODING="utf-8"
FILTER="*.java"

echo "Find all files that match the encoding $SRC_ENCODING and filter $FILTER"
FOUND_FILES=$(find . -iname "$FILTER" -exec file -i {} \; | grep "$SRC_ENCODING" | grep -Eo '^.*\.java')

for FILE in $FOUND_FILES ; do
    ORIGINAL_FILE="$FILE.$SRC_ENCODING.bkp"
    echo "Backup original file to $ORIGINAL_FILE"
    mv "$FILE" "$ORIGINAL_FILE"

    echo "converting $FILE from $SRC_ENCODING to $DST_ENCODING"
    iconv -f "$SRC_ENCODING" -t "$DST_ENCODING" "$ORIGINAL_FILE" -o "$FILE"
done

echo "Deleting backups"
find . -iname "*.$SRC_ENCODING.bkp" -exec rm {} \;

ومع بيرل، واستخدام شفر :: الكشف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top