سؤال

لدي سلسلة تحتوي على حرف � لم أتمكن من استبدالها بشكل صحيح.

String.Replace ("�"، "")؛

لا يعمل، هل يعرف أحد كيفية إزالة / استبدال � في السلسلة؟

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

المحلول

هذه هي حرف استبدال يونيكود، ufffd. فيمعلومات)

شيء من هذا القبيل يجب أن تعمل:

String strImport = "For some reason my �double quotes� were lost.";
strImport = strImport.replaceAll("\uFFFD", "\"");

نصائح أخرى

من الصعب تشخيص مشكلات الأحرف هذه لأن المعلومات تضيع بسهولة من خلال إساءة تفسير الأحرف عبر أخطاء التطبيق، والمؤهدة، cut'n'paste، إلخ.

كما أنا (و الآخرين على ما يبدو) أراها، لقد قمت بلصق ثلاثة أحرف:

codepoint   glyph   escaped    windows-1252    info
=======================================================================
U+00ef      ï       \u00ef     ef,             LATIN_1_SUPPLEMENT, LOWERCASE_LETTER
U+00bf      ¿       \u00bf     bf,             LATIN_1_SUPPLEMENT, OTHER_PUNCTUATION
U+00bd      ½       \u00bd     bd,             LATIN_1_SUPPLEMENT, OTHER_NUMBER

لتحديد الحرف، قم بتنزيل البرنامج وتشغيله هذه الصفحة. وبعد لصق شخصيتك في حقل النص وحدد وضع الرمادي؛ لصق التقرير في سؤالك. سوف يساعد الناس على تحديد الشخصية المشكلة.

أنت تطلب استبدال الحرف "�" ولكن بالنسبة لي التي تأتي من خلال ثلاثة أحرف "ï"، "¿" و "". قد تكون هذه مشكلتك ... إذا كنت تستخدم Java قبل Java 1.5، فستتحصل فقط على أحرف UCS-2، وهي فقط أول حرف UTF-8 فقط. بناء على تعليقات أخرى، من المرجح أن تكون الشخصية التي تبحث عنها هي "�" هي حرف بديل Unicode. هذه هي الشخصية التي يتم "استخدامها لتحل محل شخصية واردة قيمتها غير معروفة أو غير مبررة في Unicode".

في الواقع، بالنظر إلى التعليق من كاثي، القضية الأخرى التي قد تكون فيها هي أن Javac لا يفسر ملف .java الخاص بك كما UTF-8، على افتراض أنك تكتبه في UTF-8. جرب استخدام:

javac -encoding UTF-8 xx.java

أو تعديل شفرة المصدر الخاصة بك للقيام به:

String.replaceAll("\uFFFD", "");

كما قال آخرون، قمت بنشر 3 أحرف بدلا من واحد. أقترح عليك تشغيل هذا القنفز الصغير لرؤية ما هو فعلا في سلسلة الخاص بك:

public static void dumpString(String text)
{
    for (int i=0; i < text.length(); i++)
    {
        System.out.println("U+" + Integer.toString(text.charAt(i), 16) 
                           + " " + text.charAt(i));
    }
}

إذا قمت بنشر نتائج ذلك، فسيكون الأمر أسهل في العمل ما يحدث. (أنا لم أزعج حشوة السلسلة - يمكننا أن نفعل ذلك بالتفتيش ...)

تغيير الترميز إلى UTF-8 أثناء التحليل. سيؤدي ذلك إلى إزالة الأحرف الخاصة

استخدم ال Unicode الهروب التسلسل. وبعد أولا، سيتعين عليك العثور على CodePoint للشخصية التي تسعى إليها ليحل محلها (دعنا نقول فقط أنها ABCD في Hex):

str = str.replaceAll("\uABCD", "");

للحصول على التفاصيل

import java.io.UnsupportedEncodingException;

/**
 * File: BOM.java
 * 
 * check if the bom character is present in the given string print the string
 * after skipping the utf-8 bom characters print the string as utf-8 string on a
 * utf-8 console
 */

public class BOM
{
    private final static String BOM_STRING = "Hello World";
    private final static String ISO_ENCODING = "ISO-8859-1";
    private final static String UTF8_ENCODING = "UTF-8";
    private final static int UTF8_BOM_LENGTH = 3;

    public static void main(String[] args) throws UnsupportedEncodingException {
        final byte[] bytes = BOM_STRING.getBytes(ISO_ENCODING);
        if (isUTF8(bytes)) {
            printSkippedBomString(bytes);
            printUTF8String(bytes);
        }
    }

    private static void printSkippedBomString(final byte[] bytes) throws UnsupportedEncodingException {
        int length = bytes.length - UTF8_BOM_LENGTH;
        byte[] barray = new byte[length];
        System.arraycopy(bytes, UTF8_BOM_LENGTH, barray, 0, barray.length);
        System.out.println(new String(barray, ISO_ENCODING));
    }

    private static void printUTF8String(final byte[] bytes) throws UnsupportedEncodingException {
        System.out.println(new String(bytes, UTF8_ENCODING));
    }

    private static boolean isUTF8(byte[] bytes) {
        if ((bytes[0] & 0xFF) == 0xEF && 
            (bytes[1] & 0xFF) == 0xBB && 
            (bytes[2] & 0xFF) == 0xBF) {
            return true;
        }
        return false;
    }
}

تشريح رمز عنوان URL وإخراج Unicode. جاء هذا الرمز لي أيضا على الترجمة من Google في النص الأرمني وأحيانا البورمية المكسورة.

profilage bas� sur l'analyse de l'esprit (الفرنسية)

يجب ترجمتها على النحو التالي:

profilage basé sur l'analyse de l'esprit

لذلك، في هذه الحالة � = é

لا أعلاه إجابة حل مشكلتي. وبعد عندما أقوم بتنزيل XML IT AppPends <xml إلى بلدي XML. أنا ببساطة

xml = parser.getXmlFromUrl(url);

xml = xml.substring(3);// it remove first three character from string,

الآن يعمل بدقة.

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