কীভাবে জাভাতে এইচটিএমএল চরিত্র সত্ত্বা আনসকেপ করবেন?


147

মূলত আমি প্রদত্ত এইচটিএমএল নথিটি ডিকোড করতে এবং সমস্ত বিশেষ অক্ষর যেমন " "-> " ", ">"-> প্রতিস্থাপন করতে চাই ">"

.NET এ আমরা ব্যবহার করতে পারি HttpUtility.HtmlDecode

জাভা সমতুল্য কাজ কি?


4
& nbsp; চরিত্র সত্তা বলা হয়। শিরোনাম সম্পাদনা।
ইউজিন ইয়োকোটা

উত্তর:


182

আমি এটির জন্য অ্যাপাচি কমন্স স্ট্রিংএস্কুট ইউটেলস.উনস্কেকএইচটিএমএল 4 () ব্যবহার করেছি:

অস্তিত্ব সম্বলিত একটি স্ট্রিং আনসেস্কেপ করে যে স্ট্রাইকটিতে পলায়নের সাথে সম্পর্কিত প্রকৃত ইউনিকোড অক্ষর থাকে। এইচটিএমএল 4.0 সত্তা সমর্থন করে।


19
দুঃখের সাথে আমি আজ বুঝতে পেরেছি যে এটি HTML টি বিশেষ অক্ষরগুলি খুব ভাল ডিকোড করে না :(
সিড

1
একটি নোংরা কৌশলটি হ'ল এড়ানোর জন্য কোনও গোপন ক্ষেত্রের মধ্যে প্রাথমিকভাবে মানটি সংরক্ষণ করা হয়, তারপরে লক্ষ্য ক্ষেত্রটি লুকানো ক্ষেত্র থেকে মানটি পাওয়া উচিত।
সেটজমোড়া

2
ক্লাস StringEscapeUtils অনুমোদিত নয় এবং সরানো এ্যাপাচি Commons-টেক্সট
পাউলি

2
আমি স্ট্রিং রূপান্তর করতে চান <p>&uuml;&egrave;</p>করতে <p>üé</p>, সঙ্গে StringEscapeUtils.unescapeHtml4()আমি পেতে &lt;p&gt;üè&lt;/p&gt;। বিদ্যমান এইচটিএমএল ট্যাগ অক্ষত রাখার কোনও উপায় আছে কি?
নিক্ক্ক

48

অন্যান্য উত্তরে বর্ণিত লাইব্রেরিগুলি সূক্ষ্ম সমাধান হবে, তবে আপনি যদি ইতিমধ্যে আপনার প্রকল্পের রিয়েল-ওয়ার্ল্ড এইচটিএমএল দ্বারা খনন করে যাচ্ছেন তবে Jsoupপ্রকল্পটি কেবল "অ্যাম্পারস্যান্ড পাউন্ড এফএফএফএফ সেমিকোলন" বিষয়গুলি পরিচালনা করার চেয়ে আরও অনেক কিছু দেবে।

// textValue: <p>This is a&nbsp;sample. \"Granny\" Smith &#8211;.<\/p>\r\n
// becomes this: This is a sample. "Granny" Smith –.
// with one line of code:
// Jsoup.parse(textValue).getText(); // for older versions of Jsoup
Jsoup.parse(textValue).text();

// Another possibility may be the static unescapeEntities method:
boolean strictMode = true;
String unescapedString = org.jsoup.parser.Parser.unescapeEntities(textValue, strictMode);

এবং আপনি DOM, CSS এবং jquery- জাতীয় পদ্ধতিগুলির সেরা ব্যবহার করে ডেটা উত্তোলন এবং ম্যানিপুলেট করার জন্য সুবিধাজনক API পান। এটি ওপেন সোর্স এবং এমআইটি লাইসেন্স।


3
upvote +, তবে আমার উল্লেখ করা উচিত যে Jsoup এর নতুন সংস্করণগুলি .text()পরিবর্তে ব্যবহার করা উচিত.getText()
SourceVisor

4
সম্ভবত আরও সরাসরি ব্যবহার করা হয় org.jsoup.parser.Parser.unescapeEntities(String string, boolean inAttribute)। এপিআই ডক্স: jsoup.org/apidocs/org/jsoup/parser/…
ডানিউ

3
এটি নিখুঁত ছিল, যেহেতু আমি ইতিমধ্যে আমার প্রকল্পে জসুপ ব্যবহার করছি। এছাড়াও, @ উদ্যানু ঠিকই বলেছেন - পার্সার.উনস্কেপ এন্টিটিজগুলি ঠিক যেমন বিজ্ঞাপন হিসাবে কাজ করে।
মান্ডিসা ডাব্লু

42

আমি আমার প্রজেক্টে অ্যাপাচি কমন্স স্ট্রিংএস্কুট ইউটিস.উনেস্কেএইচটিএমএল 3 () চেষ্টা করেছি, তবে এর কার্য সম্পাদনে সন্তুষ্ট নই। দেখা যাচ্ছে, এটি অনেক অপ্রয়োজনীয় অপারেশন করে। একটির জন্য, এটি প্রতিটি কলের জন্য একটি স্ট্রিং রাইটার বরাদ্দ করে, এমনকি স্ট্রিংটিতে আনসকেপ করার মতো কিছু না থাকলেও। আমি সেই কোডটি আবার আলাদাভাবে লিখেছি, এখন এটি আরও দ্রুত কাজ করে। যে কেউ এটি গুগলে খুঁজে পান এটি এটি ব্যবহার করার জন্য স্বাগত।

নিম্নলিখিত কোডটি সমস্ত এইচটিএমএল 3 প্রতীক এবং সংখ্যাগত পলায়ন (অ্যাপাচি আনস্কেপএইচটিএমএল 3 এর সমতুল্য) আনসকেপস করে। আপনার এইচটিএমএল 4 প্রয়োজন হলে আপনি মানচিত্রে আরও এন্ট্রি যুক্ত করতে পারেন।

package com.example;

import java.io.StringWriter;
import java.util.HashMap;

public class StringUtils {

    public static final String unescapeHtml3(final String input) {
        StringWriter writer = null;
        int len = input.length();
        int i = 1;
        int st = 0;
        while (true) {
            // look for '&'
            while (i < len && input.charAt(i-1) != '&')
                i++;
            if (i >= len)
                break;

            // found '&', look for ';'
            int j = i;
            while (j < len && j < i + MAX_ESCAPE + 1 && input.charAt(j) != ';')
                j++;
            if (j == len || j < i + MIN_ESCAPE || j == i + MAX_ESCAPE + 1) {
                i++;
                continue;
            }

            // found escape 
            if (input.charAt(i) == '#') {
                // numeric escape
                int k = i + 1;
                int radix = 10;

                final char firstChar = input.charAt(k);
                if (firstChar == 'x' || firstChar == 'X') {
                    k++;
                    radix = 16;
                }

                try {
                    int entityValue = Integer.parseInt(input.substring(k, j), radix);

                    if (writer == null) 
                        writer = new StringWriter(input.length());
                    writer.append(input.substring(st, i - 1));

                    if (entityValue > 0xFFFF) {
                        final char[] chrs = Character.toChars(entityValue);
                        writer.write(chrs[0]);
                        writer.write(chrs[1]);
                    } else {
                        writer.write(entityValue);
                    }

                } catch (NumberFormatException ex) { 
                    i++;
                    continue;
                }
            }
            else {
                // named escape
                CharSequence value = lookupMap.get(input.substring(i, j));
                if (value == null) {
                    i++;
                    continue;
                }

                if (writer == null) 
                    writer = new StringWriter(input.length());
                writer.append(input.substring(st, i - 1));

                writer.append(value);
            }

            // skip escape
            st = j + 1;
            i = st;
        }

        if (writer != null) {
            writer.append(input.substring(st, len));
            return writer.toString();
        }
        return input;
    }

    private static final String[][] ESCAPES = {
        {"\"",     "quot"}, // " - double-quote
        {"&",      "amp"}, // & - ampersand
        {"<",      "lt"}, // < - less-than
        {">",      "gt"}, // > - greater-than

        // Mapping to escape ISO-8859-1 characters to their named HTML 3.x equivalents.
        {"\u00A0", "nbsp"}, // non-breaking space
        {"\u00A1", "iexcl"}, // inverted exclamation mark
        {"\u00A2", "cent"}, // cent sign
        {"\u00A3", "pound"}, // pound sign
        {"\u00A4", "curren"}, // currency sign
        {"\u00A5", "yen"}, // yen sign = yuan sign
        {"\u00A6", "brvbar"}, // broken bar = broken vertical bar
        {"\u00A7", "sect"}, // section sign
        {"\u00A8", "uml"}, // diaeresis = spacing diaeresis
        {"\u00A9", "copy"}, // © - copyright sign
        {"\u00AA", "ordf"}, // feminine ordinal indicator
        {"\u00AB", "laquo"}, // left-pointing double angle quotation mark = left pointing guillemet
        {"\u00AC", "not"}, // not sign
        {"\u00AD", "shy"}, // soft hyphen = discretionary hyphen
        {"\u00AE", "reg"}, // ® - registered trademark sign
        {"\u00AF", "macr"}, // macron = spacing macron = overline = APL overbar
        {"\u00B0", "deg"}, // degree sign
        {"\u00B1", "plusmn"}, // plus-minus sign = plus-or-minus sign
        {"\u00B2", "sup2"}, // superscript two = superscript digit two = squared
        {"\u00B3", "sup3"}, // superscript three = superscript digit three = cubed
        {"\u00B4", "acute"}, // acute accent = spacing acute
        {"\u00B5", "micro"}, // micro sign
        {"\u00B6", "para"}, // pilcrow sign = paragraph sign
        {"\u00B7", "middot"}, // middle dot = Georgian comma = Greek middle dot
        {"\u00B8", "cedil"}, // cedilla = spacing cedilla
        {"\u00B9", "sup1"}, // superscript one = superscript digit one
        {"\u00BA", "ordm"}, // masculine ordinal indicator
        {"\u00BB", "raquo"}, // right-pointing double angle quotation mark = right pointing guillemet
        {"\u00BC", "frac14"}, // vulgar fraction one quarter = fraction one quarter
        {"\u00BD", "frac12"}, // vulgar fraction one half = fraction one half
        {"\u00BE", "frac34"}, // vulgar fraction three quarters = fraction three quarters
        {"\u00BF", "iquest"}, // inverted question mark = turned question mark
        {"\u00C0", "Agrave"}, // А - uppercase A, grave accent
        {"\u00C1", "Aacute"}, // Б - uppercase A, acute accent
        {"\u00C2", "Acirc"}, // В - uppercase A, circumflex accent
        {"\u00C3", "Atilde"}, // Г - uppercase A, tilde
        {"\u00C4", "Auml"}, // Д - uppercase A, umlaut
        {"\u00C5", "Aring"}, // Е - uppercase A, ring
        {"\u00C6", "AElig"}, // Ж - uppercase AE
        {"\u00C7", "Ccedil"}, // З - uppercase C, cedilla
        {"\u00C8", "Egrave"}, // И - uppercase E, grave accent
        {"\u00C9", "Eacute"}, // Й - uppercase E, acute accent
        {"\u00CA", "Ecirc"}, // К - uppercase E, circumflex accent
        {"\u00CB", "Euml"}, // Л - uppercase E, umlaut
        {"\u00CC", "Igrave"}, // М - uppercase I, grave accent
        {"\u00CD", "Iacute"}, // Н - uppercase I, acute accent
        {"\u00CE", "Icirc"}, // О - uppercase I, circumflex accent
        {"\u00CF", "Iuml"}, // П - uppercase I, umlaut
        {"\u00D0", "ETH"}, // Р - uppercase Eth, Icelandic
        {"\u00D1", "Ntilde"}, // С - uppercase N, tilde
        {"\u00D2", "Ograve"}, // Т - uppercase O, grave accent
        {"\u00D3", "Oacute"}, // У - uppercase O, acute accent
        {"\u00D4", "Ocirc"}, // Ф - uppercase O, circumflex accent
        {"\u00D5", "Otilde"}, // Х - uppercase O, tilde
        {"\u00D6", "Ouml"}, // Ц - uppercase O, umlaut
        {"\u00D7", "times"}, // multiplication sign
        {"\u00D8", "Oslash"}, // Ш - uppercase O, slash
        {"\u00D9", "Ugrave"}, // Щ - uppercase U, grave accent
        {"\u00DA", "Uacute"}, // Ъ - uppercase U, acute accent
        {"\u00DB", "Ucirc"}, // Ы - uppercase U, circumflex accent
        {"\u00DC", "Uuml"}, // Ь - uppercase U, umlaut
        {"\u00DD", "Yacute"}, // Э - uppercase Y, acute accent
        {"\u00DE", "THORN"}, // Ю - uppercase THORN, Icelandic
        {"\u00DF", "szlig"}, // Я - lowercase sharps, German
        {"\u00E0", "agrave"}, // а - lowercase a, grave accent
        {"\u00E1", "aacute"}, // б - lowercase a, acute accent
        {"\u00E2", "acirc"}, // в - lowercase a, circumflex accent
        {"\u00E3", "atilde"}, // г - lowercase a, tilde
        {"\u00E4", "auml"}, // д - lowercase a, umlaut
        {"\u00E5", "aring"}, // е - lowercase a, ring
        {"\u00E6", "aelig"}, // ж - lowercase ae
        {"\u00E7", "ccedil"}, // з - lowercase c, cedilla
        {"\u00E8", "egrave"}, // и - lowercase e, grave accent
        {"\u00E9", "eacute"}, // й - lowercase e, acute accent
        {"\u00EA", "ecirc"}, // к - lowercase e, circumflex accent
        {"\u00EB", "euml"}, // л - lowercase e, umlaut
        {"\u00EC", "igrave"}, // м - lowercase i, grave accent
        {"\u00ED", "iacute"}, // н - lowercase i, acute accent
        {"\u00EE", "icirc"}, // о - lowercase i, circumflex accent
        {"\u00EF", "iuml"}, // п - lowercase i, umlaut
        {"\u00F0", "eth"}, // р - lowercase eth, Icelandic
        {"\u00F1", "ntilde"}, // с - lowercase n, tilde
        {"\u00F2", "ograve"}, // т - lowercase o, grave accent
        {"\u00F3", "oacute"}, // у - lowercase o, acute accent
        {"\u00F4", "ocirc"}, // ф - lowercase o, circumflex accent
        {"\u00F5", "otilde"}, // х - lowercase o, tilde
        {"\u00F6", "ouml"}, // ц - lowercase o, umlaut
        {"\u00F7", "divide"}, // division sign
        {"\u00F8", "oslash"}, // ш - lowercase o, slash
        {"\u00F9", "ugrave"}, // щ - lowercase u, grave accent
        {"\u00FA", "uacute"}, // ъ - lowercase u, acute accent
        {"\u00FB", "ucirc"}, // ы - lowercase u, circumflex accent
        {"\u00FC", "uuml"}, // ь - lowercase u, umlaut
        {"\u00FD", "yacute"}, // э - lowercase y, acute accent
        {"\u00FE", "thorn"}, // ю - lowercase thorn, Icelandic
        {"\u00FF", "yuml"}, // я - lowercase y, umlaut
    };

    private static final int MIN_ESCAPE = 2;
    private static final int MAX_ESCAPE = 6;

    private static final HashMap<String, CharSequence> lookupMap;
    static {
        lookupMap = new HashMap<String, CharSequence>();
        for (final CharSequence[] seq : ESCAPES) 
            lookupMap.put(seq[1].toString(), seq[0]);
    }

}

সম্প্রতি, আমাকে একটি ধীর স্ট্রুটস প্রকল্পটি অনুকূলিত করতে হয়েছিল। দেখা গেল যে প্রচ্ছদের আড়ালে স্ট্রুটস অ্যাপাচি কে এইচটিএমএল স্ট্রিংটি ডিফল্টরূপে পালিয়ে যেতে কল করে ( <s:property value="..."/>)। এস্কেপিং বন্ধ করা ( <s:property value="..." escaping="false"/>)) 5% থেকে 20% দ্রুত চালানোর জন্য কিছু পৃষ্ঠা পেয়েছে।
স্টিফান

পরে আমি জানতে পারি যে যুক্তি হিসাবে খালি স্ট্রিং দেওয়ার সময় এই কোডটি লুপটি প্রবেশ করতে পারে। বর্তমান সংস্করণে সমস্যাটি স্থির রয়েছে।
নিক ফ্রোলভ

এই পালাতে বা অনিরাপদ না? & amp; ডিকোড করা হয় না কেবল & মানচিত্রে যুক্ত করা হয়েছে, সুতরাং এটি কেবল একপথে কাজ করে?
মিমি

3
একটি স্ট্রিং রাইটার অভ্যন্তরীণভাবে একটি স্ট্রিংবফার ব্যবহার করে যা লকিং ব্যবহার করে। স্ট্রিংবিল্ডার সরাসরি ব্যবহার করা দ্রুত হওয়া উচিত।
অ্যাক্সেল ডারফ্লার

4
@ নিকফ্রলভ, আপনার মন্তব্যগুলি কিছুটা গণ্ডগোল হয়েছে বলে মনে হচ্ছে। aumlউদাহরণস্বরূপ äএবং না д
আইয়ুব

12

নিম্নলিখিত লাইব্রেরিটি জাভাতে এইচটিএমএল পলায়নের জন্যও ব্যবহার করা যেতে পারে: আনবিস্কেপ

এইচটিএমএলকে এভাবে অনস্কেপ করা যায়:

final String unescapedText = HtmlEscape.unescapeHtml(escapedText); 

2
এটি এর দ্বারা কিছুই করেনি:%3Chtml%3E%0D%0A%3Chead%3E%0D%0A%3Ctitle%3Etest%3C%2Ftitle%3E%0D%0A%3C%2Fhead%3E%0D%0A%3Cbody%3E%0D%0Atest%0D%0A%3C%2Fbody%3E%0D%0A%3C%2Fhtml%3E
হুমকি

40
@ থ্রিয়াট আপনার পাঠ্যটি এইচটিএমএল-এনকোডড নয়, এটি url- এনকোডযুক্ত।
মিখাইল ব্যাটার

9

এটি আমার জন্য কাজ করেছে,

import org.apache.commons.lang.StringEscapeUtils;
...
String decodedXML= StringEscapeUtils.unescapeHtml(encodedXML);

অথবা

import org.apache.commons.lang3.StringEscapeUtils;
...
String decodedXML= StringEscapeUtils.unescapeHtml4(encodedXML);

আমি অনুমান করি যে এটি lang3সুস্পষ্ট কারণে ব্যবহার করা সর্বদা ভাল better আশাকরি এটা সাহায্য করবে :)


4

কোনও বাহ্যিক গ্রন্থাগার ব্যতীত খুব সহজ তবে অদক্ষ সমাধান হ'ল:

public static String unescapeHtml3( String str ) {
    try {
        HTMLDocument doc = new HTMLDocument();
        new HTMLEditorKit().read( new StringReader( "<html><body>" + str ), doc, 0 );
        return doc.getText( 1, doc.getLength() );
    } catch( Exception ex ) {
        return str;
    }
}

এটি কেবল তখনই ব্যবহার করা উচিত যদি আপনার ডিকোড করার জন্য কেবল ছোট স্ট্রিং থাকে।


1
খুব কাছাকাছি হলেও সঠিক নয় - এটি "qwAS12ƷƸDžǚǪǼȌ" কে "qwAS12ƷƸDžǚǪǼȌ \ n" এ রূপান্তর করেছে।
গ্রেগ

3

সবচেয়ে নির্ভরযোগ্য উপায় সঙ্গে হয়

String cleanedString = StringEscapeUtils.unescapeHtml4(originalString);

থেকে org.apache.commons.lang3.StringEscapeUtils

এবং সাদা স্থান থেকে বাঁচতে

cleanedString = cleanedString.trim();

এটি ডিবিতে অবিচল না হওয়ার জন্য ওয়েব ফর্মগুলিতে অনুলিপি এবং পেস্ট করার কারণে শ্বেতস্পেসগুলি নিশ্চিত করবে।


1

স্প্রিং ফ্রেমওয়ার্ক এইচটিএমএল ইউটিস

আপনি যদি ইতিমধ্যে বসন্ত কাঠামো ব্যবহার করছেন তবে নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন:

import static org.springframework.web.util.HtmlUtils.htmlUnescape;

...

String result = htmlUnescape(source);

0

এইচটিএমএল মণিপুলেটর জাভা ক্লাসটি ব্যবহার করার কথা বিবেচনা করুন । আপনাকে কিছু আইটেম যুক্ত করতে হবে (সমস্ত সত্ত্বা তালিকায় নেই)।

কেভিন হাকানসনের পরামর্শ অনুসারে অ্যাপাচি কমন্স স্ট্রিংস্ক্রপ ইউটিসগুলি আমার জন্য 100% কাজ করে না; & # 145 (একক উদ্ধৃতি বাম) যেমন কয়েকটি সত্ত্বাকে কোনওভাবে '222' তে অনুবাদ করা হয়েছিল। আমি org.jsoup ব্যবহার করেও চেষ্টা করেছি এবং একই সমস্যা ছিল।


0

আমার ক্ষেত্রে আমি প্রতি ভেরিয়েবলের প্রতিটি সত্তা পরীক্ষা করে প্রতিস্থাপনের পদ্ধতিটি ব্যবহার করি, আমার কোডটি এরকম দেখাচ্ছে:

text = text.replace("&Ccedil;", "Ç");
text = text.replace("&ccedil;", "ç");
text = text.replace("&Aacute;", "Á");
text = text.replace("&Acirc;", "Â");
text = text.replace("&Atilde;", "Ã");
text = text.replace("&Eacute;", "É");
text = text.replace("&Ecirc;", "Ê");
text = text.replace("&Iacute;", "Í");
text = text.replace("&Ocirc;", "Ô");
text = text.replace("&Otilde;", "Õ");
text = text.replace("&Oacute;", "Ó");
text = text.replace("&Uacute;", "Ú");
text = text.replace("&aacute;", "á");
text = text.replace("&acirc;", "â");
text = text.replace("&atilde;", "ã");
text = text.replace("&eacute;", "é");
text = text.replace("&ecirc;", "ê");
text = text.replace("&iacute;", "í");
text = text.replace("&ocirc;", "ô");
text = text.replace("&otilde;", "õ");
text = text.replace("&oacute;", "ó");
text = text.replace("&uacute;", "ú");

আমার ক্ষেত্রে এটি খুব ভাল কাজ করেছে।


2
এটি প্রতিটি বিশেষ সত্তা নয়। এমনকি প্রশ্নে উল্লিখিত দু'জন নিখোঁজ রয়েছে।
স্যান্ডি গিফোর্ড

এই ভাল স্কেল করা হবে না
denov

-7

যদি আপনি এইচটিএমএল স্পেশালচার্স_ডেকোড php ফাংশনটি get_html_translation_table () টেবিলটি ডাম্প করতে ব্যবহার করেন এবং তারপরে জাভা কোডটি ব্যবহার করুন তবে নকল করতে চান

static Map<String,String> html_specialchars_table = new Hashtable<String,String>();
static {
        html_specialchars_table.put("&lt;","<");
        html_specialchars_table.put("&gt;",">");
        html_specialchars_table.put("&amp;","&");
}
static String htmlspecialchars_decode_ENT_NOQUOTES(String s){
        Enumeration en = html_specialchars_table.keys();
        while(en.hasMoreElements()){
                String key = en.nextElement();
                String val = html_specialchars_table.get(key);
                s = s.replaceAll(key, val);
        }
        return s;
}

7
এত castালাই করবেন না; জেনেরিকগুলি সেই হাশম্যাপে ব্যবহার করুন! এছাড়াও, একটি পূর্বাঞ্চ ব্যবহার করুন, এটির পুনরুক্তি করার জন্য কিছুক্ষণ নয়, কোডটি আরও পঠনযোগ্য দেখায়!
নটহাগো

3
@ বালাদত্ত যদি আপনি আপনার উত্তরটি উন্নতি করেন তবে ছেলেরা আপনাকে পয়েন্ট দেবে :)
স্পার্কস্পাইডার

3
আপনার ফাংশন এবং পরিবর্তনশীল নামগুলিও উন্নত করুন, @ বালা B
টমাস ডব্লিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.