উদ্দেশ্য-সি / কোকো টাচে HTML অক্ষর ডিকোডিং


103

প্রথমত, আমি এটি খুঁজে পেয়েছি: সিটিএমএল অবজেক্ট / সিলেক্ট করা অবজেক্টিভ , তবে এটি আমার পক্ষে কাজ করে না।

আমার এনকোড করা অক্ষরগুলি (আরএসএস ফিড থেকে এসেছেন, বিটিডাব্লু) এর মতো দেখতে: &

আমি পুরো নেট জুড়ে অনুসন্ধান করেছি এবং সম্পর্কিত আলোচনা পেয়েছি, তবে আমার নির্দিষ্ট এনকোডিংয়ের জন্য কোনও ঠিক হয়নি, আমি মনে করি তাদের হেক্সাডেসিমাল অক্ষর বলা হয় characters


3
এই মন্তব্যটি মূল প্রশ্নের ছয় মাস পরে, সুতরাং এই প্রশ্নের উত্তর ও সমাধানের সন্ধানে যারা হোঁচট খায় তাদের পক্ষে এটি আরও বেশি। অনুরূপ একটি প্রশ্ন সম্প্রতি যে আমি উত্তর দিলাম এসেছেন stackoverflow.com/questions/2254862/... এটা RegexKitLite এবং ব্লক অনুসন্ধান করা এবং প্রতিস্থাপন করতে ব্যবহার &#...;তার সমতুল্য অক্ষর দিয়ে একটি স্ট্রিং।
জন

বিশেষত কোনটি "কাজ করে না"? আমি এই প্রশ্নের এমন কিছুই দেখতে পাচ্ছি না যা পূর্ববর্তী প্রশ্নের সদৃশ নয়।
পিটার হোসি

দশমিক। হেক্সাডেসিমাল 8
কেনেটিএম

দশমিক এবং হেক্সাডেসিমাল যে দশমিক হ'ল পার্থক্য হ'ল দশমিক বেস -10, যেখানে হেক্সাডেসিমাল বেস -16 16 "38" প্রতিটি বেসে আলাদা সংখ্যা; দশম বেসে, এটি 3 × 10 + 8 × 1 = আটত্রিশ, যেখানে বেস -১ 16 এ এটি 3 × 16 + 8 × 1 = ছাপান্ন। উচ্চতর সংখ্যাগুলি বেসের উচ্চ গুণমান (বহুগুণ) হয়; সর্বনিম্ন পুরো অঙ্কটি বেস 0 (= 1), পরের উচ্চতর সংখ্যাটি বেস 1 (= বেস), পরেরটি বেস ** 2 (= বেস * বেস), ইত্যাদি This
পিটার হোসি

উত্তর:


46

এগুলিকে বলা হয় চরিত্র সত্তার রেফারেন্স । যখন তারা রূপ নেয় &#<number>;তাদের সংখ্যার সত্তা রেফারেন্স বলা হয় । মূলত, এটি বাইটের একটি স্ট্রিং প্রতিনিধিত্ব যা প্রতিস্থাপন করা উচিত। এর ক্ষেত্রে &#038;এটি আইএসও -8859-1 অক্ষর এনকোডিং স্কিমের 38 টির মান সহ চরিত্রটিকে উপস্থাপন করে &

অ্যাম্পারস্যান্ডটি আরএসএসে এনকোড করার কারণ এটি একটি সংরক্ষিত বিশেষ চরিত্র।

আপনি কি করতে প্রয়োজন স্ট্রিং বিশ্লেষণ এবং তাদের মধ্যে মান মিলে একটি বাইট সঙ্গে সত্ত্বা প্রতিস্থাপন হয় &#এবং ;। উদ্দেশ্যমূলক সিতে এটি করার কোনও দুর্দান্ত উপায় আমি জানি না, তবে এই স্ট্যাক ওভারফ্লো প্রশ্নটি কিছুটা সহায়ক হতে পারে।

সম্পাদনা: যেহেতু দু'বছর আগে এর উত্তর দেওয়ার কিছু দুর্দান্ত সমাধান রয়েছে; নীচে @ মিশেল জলপ্রপাতের উত্তর দেখুন।


2
+1 আমি ঠিক একই উত্তর জমা দিতে
চলেছি

"মূলত, এটি প্রতিস্থাপন করা উচিত বাইট একটি স্ট্রিং প্রতিনিধিত্ব।" আরও চরিত্র পছন্দ। এটি পাঠ্য, ডেটা নয়; পাঠ্যটিকে ডেটাতে রূপান্তর করার পরে, অক্ষরটি অক্ষর এবং এনকোডিংয়ের উপর নির্ভর করে একাধিক বাইট দখল করতে পারে।
পিটার হোসি

উত্তরের জন্য ধন্যবাদ. আপনি বলেছিলেন "এটি আইএসও -8859-1 অক্ষর এনকোডিং স্কিমের 38 টির মান সহ চরিত্রকে উপস্থাপন করে যা &" আপনি কি এ ব্যাপারে নিশ্চিত? আপনার কি এই ধরণের একটি অক্ষর টেবিলের লিঙ্ক আছে? কারণ আমি যা মনে করি তা থেকে এটি একটি একক উক্তি ছিল।
ট্র্যাজনিক

en.wikedia.org/wiki/ISO/IEC_8859-1#ISO-8859-1 বা কেবল টাইপ করুন & # 038; গুগল মধ্যে।
ম্যাট ব্রিজগুলি

এবং কি সম্পর্কে & amp; বা & অনুলিপি; প্রতীক?
ভোকিলাম

162

এইচটিএমএল জন্য আমার এনএসএস স্ট্রিং বিভাগ দেখুন । এখানে উপলভ্য পদ্ধতিগুলি:

- (NSString *)stringByConvertingHTMLToPlainText;
- (NSString *)stringByDecodingHTMLEntities;
- (NSString *)stringByEncodingHTMLEntities;
- (NSString *)stringWithNewLinesAsBRs;
- (NSString *)stringByRemovingNewLinesAndWhitespace;

3
বউ, দুর্দান্ত ফাংশন। আপনার স্ট্রিংবাইডকোডিংএক্সএমলেন্টিটিস পদ্ধতিটি আমার দিনকে পরিণত করেছে! ধন্যবাদ!
ব্রায়ান মোসকাউ

3
কোনও সমস্যা নেই;) খুশী আপনি এটি কার্যকর খুঁজে পেয়েছেন!
মাইকেল জলপ্রপাত

4
কয়েক ঘন্টা অনুসন্ধানের পরে আমি জানি যে এটি করার একমাত্র উপায় এটি সত্যই কাজ করে। এনএসএসস্ট্রিং স্ট্রিং পদ্ধতির জন্য বহিষ্কৃত that সাবাশ.
অ্যাডাম ইবারবাচ

1
আমার ব্যবহারের ক্ষেত্রে মাইকের লাইসেন্সটিতে (2) খুব সীমাবদ্ধ বলে আমি খুঁজে পেয়েছি তাই আমি নিকিতার সমাধানটি ব্যবহার করেছি। গুগল টুলবক্স থেকে তিনটি অ্যাপাচি-২.০-লাইসেন্সযুক্ত ফাইল সহ আমার জন্য দুর্দান্ত কাজ করে।
jaime

10
এআরসি-র কোড আপডেট সহজ হবে .. এক্সকোড আর্কি ত্রুটি এবং
বিল্ডিংয়ের

52

ড্যানিয়েলের একটি মূলত খুব সুন্দর, এবং আমি সেখানে কয়েকটি সমস্যা স্থির করেছি:

  1. এনএসএসক্যানারের জন্য স্কিপিং চরিত্রটি সরানো হয়েছে (অন্যথায় দুটি ধারাবাহিক সত্তার মধ্যে ফাঁকা স্থান উপেক্ষা করা হবে

    [স্ক্যানার সেটচ্যাকার্টারস টোবিস্কিপড: শূন্য];

  2. বিচ্ছিন্ন 'এবং' চিহ্ন থাকা অবস্থায় পার্সিং স্থির করে নিন (এর জন্য 'সঠিক' আউটপুট কী তা আমি নিশ্চিত নই, আমি এটি কেবল ফায়ারফক্সের সাথে তুলনা করেছি):

যেমন

    &#ABC DF & B&#39;  & C&#39; Items (288)

পরিবর্তিত কোডটি এখানে:

- (NSString *)stringByDecodingXMLEntities {
    NSUInteger myLength = [self length];
    NSUInteger ampIndex = [self rangeOfString:@"&" options:NSLiteralSearch].location;

    // Short-circuit if there are no ampersands.
    if (ampIndex == NSNotFound) {
        return self;
    }
    // Make result string with some extra capacity.
    NSMutableString *result = [NSMutableString stringWithCapacity:(myLength * 1.25)];

    // First iteration doesn't need to scan to & since we did that already, but for code simplicity's sake we'll do it again with the scanner.
    NSScanner *scanner = [NSScanner scannerWithString:self];

    [scanner setCharactersToBeSkipped:nil];

    NSCharacterSet *boundaryCharacterSet = [NSCharacterSet characterSetWithCharactersInString:@" \t\n\r;"];

    do {
        // Scan up to the next entity or the end of the string.
        NSString *nonEntityString;
        if ([scanner scanUpToString:@"&" intoString:&nonEntityString]) {
            [result appendString:nonEntityString];
        }
        if ([scanner isAtEnd]) {
            goto finish;
        }
        // Scan either a HTML or numeric character entity reference.
        if ([scanner scanString:@"&amp;" intoString:NULL])
            [result appendString:@"&"];
        else if ([scanner scanString:@"&apos;" intoString:NULL])
            [result appendString:@"'"];
        else if ([scanner scanString:@"&quot;" intoString:NULL])
            [result appendString:@"\""];
        else if ([scanner scanString:@"&lt;" intoString:NULL])
            [result appendString:@"<"];
        else if ([scanner scanString:@"&gt;" intoString:NULL])
            [result appendString:@">"];
        else if ([scanner scanString:@"&#" intoString:NULL]) {
            BOOL gotNumber;
            unsigned charCode;
            NSString *xForHex = @"";

            // Is it hex or decimal?
            if ([scanner scanString:@"x" intoString:&xForHex]) {
                gotNumber = [scanner scanHexInt:&charCode];
            }
            else {
                gotNumber = [scanner scanInt:(int*)&charCode];
            }

            if (gotNumber) {
                [result appendFormat:@"%C", (unichar)charCode];

                [scanner scanString:@";" intoString:NULL];
            }
            else {
                NSString *unknownEntity = @"";

                [scanner scanUpToCharactersFromSet:boundaryCharacterSet intoString:&unknownEntity];


                [result appendFormat:@"&#%@%@", xForHex, unknownEntity];

                //[scanner scanUpToString:@";" intoString:&unknownEntity];
                //[result appendFormat:@"&#%@%@;", xForHex, unknownEntity];
                NSLog(@"Expected numeric character entity but got &#%@%@;", xForHex, unknownEntity);

            }

        }
        else {
            NSString *amp;

            [scanner scanString:@"&" intoString:&amp];  //an isolated & symbol
            [result appendString:amp];

            /*
            NSString *unknownEntity = @"";
            [scanner scanUpToString:@";" intoString:&unknownEntity];
            NSString *semicolon = @"";
            [scanner scanString:@";" intoString:&semicolon];
            [result appendFormat:@"%@%@", unknownEntity, semicolon];
            NSLog(@"Unsupported XML character entity %@%@", unknownEntity, semicolon);
             */
        }

    }
    while (![scanner isAtEnd]);

finish:
    return result;
}

এটাই প্রশ্নের সুনির্দিষ্ট উত্তর হওয়া উচিত !! ধন্যবাদ!
বলিভা

এটি দুর্দান্ত কাজ করেছে। দুর্ভাগ্যক্রমে সর্বোচ্চ রেট দেওয়া উত্তরের কোড আরসি সমস্যার কারণে আর কাজ করে না, তবে এটি করে।
টেড কুল্প

@ টেডকल्प এটি ঠিকঠাক কাজ করে, আপনার কেবল ফাইলের জন্য আরসি অক্ষম করতে হবে। stackoverflow.com/questions/6646052/…
কাইল

আমি পারলে দু'বার থাম্বস আপ করতাম।
কিবিটজ 503

এখনও 2016+ এই প্রশ্ন পরিদর্শন মানুষের জন্য সুইফট অনুবাদ: stackoverflow.com/a/35303635/1153630
ম্যাক্স Chuquimia

46

আইওএস 7 এর মতো, আপনি একটি ব্যবহার করে স্থানীয়ভাবে এইচটিএমএল অক্ষর ডিকোড করতে NSAttributedStringসঙ্গে NSHTMLTextDocumentTypeঅ্যাট্রিবিউট:

NSString *htmlString = @"&#63743; &amp; &#38; &lt; &gt; &trade; &copy; &hearts; &clubs; &spades; &diams;";
NSData *stringData = [htmlString dataUsingEncoding:NSUTF8StringEncoding];

NSDictionary *options = @{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType};
NSAttributedString *decodedString;
decodedString = [[NSAttributedString alloc] initWithData:stringData
                                                 options:options
                                      documentAttributes:NULL
                                                   error:NULL];

ডিকোডযুক্ত বৈশিষ্ট্যযুক্ত স্ট্রিংটি এখন প্রদর্শিত হবে:  & & <> ™ © ♥ ♣ ♠ ♦ ♦

দ্রষ্টব্য: এটি কেবলমাত্র মূল থ্রেডে কল করলে কাজ করবে।


6
সেরা উত্তর যদি আপনার আইওএস 6 এবং এর চেয়ে বেশি বয়স্কদের সমর্থন করার প্রয়োজন না হয়
জেসারমোবাইল

1
না, সেরা কেউ যদি এটি বিজি থ্রেডে এনকোড করতে চায় তবে ও
বেডেলাক্স

4
এটি কোনও সত্তাকে ডিকোডিংয়ের জন্য কাজ করেছিল, তবে এটি একটি এনকোডেড ড্যাশও গোলমাল করেছিল।
অ্যান্ড্রু

এটি মূল থ্রেডে বাধ্য হতে বাধ্য। সুতরাং আপনি সম্ভবত না করতে চাইলে এটি করতে চান না।
কীথ স্মাইলি

এটি ইউআইটিবেলভিউয়ের বিষয় হলে কেবল জিইউআইকে ঝুলিয়ে রাখে। সুতরাং, সঠিকভাবে কাজ না।
আসিফ বিলাল

35

কেউ সহজ বিকল্পগুলির একটি উল্লেখ করতে পারে বলে মনে হয় না: ম্যাকের জন্য গুগল টুলবক্স
(নাম সত্ত্বেও, এটি আইওএসেও কাজ করে))

https://github.com/google/google-toolbox-for-mac/blob/master/Foundation/GTMNSString%2BHTML.h

/// Get a string where internal characters that are escaped for HTML are unescaped 
//
///  For example, '&amp;' becomes '&'
///  Handles &#32; and &#x32; cases as well
///
//  Returns:
//    Autoreleased NSString
//
- (NSString *)gtm_stringByUnescapingFromHTML;

এবং প্রকল্পে আমাকে কেবল তিনটি ফাইল অন্তর্ভুক্ত করতে হয়েছিল: শিরোনাম, বাস্তবায়ন এবং GTMDefines.h


আমি এই তিনটি স্ক্রিপ্ট অন্তর্ভুক্ত করেছি, তবে আমি এখন এটি কীভাবে ব্যবহার করতে পারি?
বুরুত তোমাজিন

@ বুরুট-টি [আমার স্ট্রিং জিটিএম_ স্ট্রিংবাইউনেস্কেপিংফর্ম এইচটিএমএল]
নিকিতা রাইবাক

2
আমি বেছে নেওয়া হয়েছে তাই আমি এটা চাপ সঙ্গে সামঞ্জস্যপূর্ণ করতে এই কাজ করা প্রয়োজন শুধুমাত্র যারা তিন ফাইল অন্তর্ভুক্ত করুন: code.google.com/p/google-toolbox-for-mac/wiki/ARC_Compatibility
Jaime

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

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

17

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

এছাড়াও, এটি ত্রুটিযুক্ত স্ট্রিংগুলি পরিচালনা করে (যখন আপনি অক্ষরের একটি অবৈধ ক্রম অনুসরণ করেন এবং অনুসরণ করেন) অপেক্ষাকৃত কৃপণভাবে, যা আমার প্রকাশিত অ্যাপ্লিকেশনটিতে এই কোডটি ব্যবহার করে তা অত্যন্ত গুরুত্বপূর্ণ হয়ে উঠেছে ।

- (NSString *)stringByDecodingXMLEntities {
    NSUInteger myLength = [self length];
    NSUInteger ampIndex = [self rangeOfString:@"&" options:NSLiteralSearch].location;

    // Short-circuit if there are no ampersands.
    if (ampIndex == NSNotFound) {
        return self;
    }
    // Make result string with some extra capacity.
    NSMutableString *result = [NSMutableString stringWithCapacity:(myLength * 1.25)];

    // First iteration doesn't need to scan to & since we did that already, but for code simplicity's sake we'll do it again with the scanner.
    NSScanner *scanner = [NSScanner scannerWithString:self];
    do {
        // Scan up to the next entity or the end of the string.
        NSString *nonEntityString;
        if ([scanner scanUpToString:@"&" intoString:&nonEntityString]) {
            [result appendString:nonEntityString];
        }
        if ([scanner isAtEnd]) {
            goto finish;
        }
        // Scan either a HTML or numeric character entity reference.
        if ([scanner scanString:@"&amp;" intoString:NULL])
            [result appendString:@"&"];
        else if ([scanner scanString:@"&apos;" intoString:NULL])
            [result appendString:@"'"];
        else if ([scanner scanString:@"&quot;" intoString:NULL])
            [result appendString:@"\""];
        else if ([scanner scanString:@"&lt;" intoString:NULL])
            [result appendString:@"<"];
        else if ([scanner scanString:@"&gt;" intoString:NULL])
            [result appendString:@">"];
        else if ([scanner scanString:@"&#" intoString:NULL]) {
            BOOL gotNumber;
            unsigned charCode;
            NSString *xForHex = @"";

            // Is it hex or decimal?
            if ([scanner scanString:@"x" intoString:&xForHex]) {
                gotNumber = [scanner scanHexInt:&charCode];
            }
            else {
                gotNumber = [scanner scanInt:(int*)&charCode];
            }
            if (gotNumber) {
                [result appendFormat:@"%C", charCode];
            }
            else {
                NSString *unknownEntity = @"";
                [scanner scanUpToString:@";" intoString:&unknownEntity];
                [result appendFormat:@"&#%@%@;", xForHex, unknownEntity];
                NSLog(@"Expected numeric character entity but got &#%@%@;", xForHex, unknownEntity);
            }
            [scanner scanString:@";" intoString:NULL];
        }
        else {
            NSString *unknownEntity = @"";
            [scanner scanUpToString:@";" intoString:&unknownEntity];
            NSString *semicolon = @"";
            [scanner scanString:@";" intoString:&semicolon];
            [result appendFormat:@"%@%@", unknownEntity, semicolon];
            NSLog(@"Unsupported XML character entity %@%@", unknownEntity, semicolon);
        }
    }
    while (![scanner isAtEnd]);

finish:
    return result;
}

কোডের খুব দরকারী অংশ, তবে এতে বেশ কয়েকটি সমস্যা রয়েছে যা ওয়াল্টির দ্বারা সম্বোধন করা হয়েছিল। ভাগ করে নেওয়ার জন্য ধন্যবাদ!
মাইকেল জলপ্রপাত

আপনি কীভাবে ল্যাম্বদা, মিউ, নু, পাই চিহ্নগুলি দেখানোর একটি উপায় জানেন যাতে তাদের এক্সএমএল সত্ত্বাগুলি ডিকোড করে & মাইক্রো; ... ect ????
চিন্তাকাদ

gotoএর ভয়ঙ্কর কোড স্টাইল হিসাবে আপনার ব্যবহার এড়ানো উচিত । আপনার goto finish;সাথে লাইনটি প্রতিস্থাপন করা উচিত break;
স্টানার

4

RegexKitLite ফ্রেমওয়ার্কটি ব্যবহার করে এটিই আমি এইভাবে করি :

-(NSString*) decodeHtmlUnicodeCharacters: (NSString*) html {
NSString* result = [html copy];
NSArray* matches = [result arrayOfCaptureComponentsMatchedByRegex: @"\\&#([\\d]+);"];

if (![matches count]) 
    return result;

for (int i=0; i<[matches count]; i++) {
    NSArray* array = [matches objectAtIndex: i];
    NSString* charCode = [array objectAtIndex: 1];
    int code = [charCode intValue];
    NSString* character = [NSString stringWithFormat:@"%C", code];
    result = [result stringByReplacingOccurrencesOfString: [array objectAtIndex: 0]
                                               withString: character];      
}   
return result;  

}

আশা করি এটি কারও সাহায্য করবে।


4

আপনি এই সমস্যাটি সমাধান করতে এই ফাংশনটি ব্যবহার করতে পারেন।

+ (NSString*) decodeHtmlUnicodeCharactersToString:(NSString*)str
{
    NSMutableString* string = [[NSMutableString alloc] initWithString:str];  // #&39; replace with '
    NSString* unicodeStr = nil;
    NSString* replaceStr = nil;
    int counter = -1;

    for(int i = 0; i < [string length]; ++i)
    {
        unichar char1 = [string characterAtIndex:i];    
        for (int k = i + 1; k < [string length] - 1; ++k)
        {
            unichar char2 = [string characterAtIndex:k];    

            if (char1 == '&'  && char2 == '#' ) 
            {   
                ++counter;
                unicodeStr = [string substringWithRange:NSMakeRange(i + 2 , 2)];    
                // read integer value i.e, 39
                replaceStr = [string substringWithRange:NSMakeRange (i, 5)];     //     #&39;
                [string replaceCharactersInRange: [string rangeOfString:replaceStr] withString:[NSString stringWithFormat:@"%c",[unicodeStr intValue]]];
                break;
            }
        }
    }
    [string autorelease];

    if (counter > 1)
        return  [self decodeHtmlUnicodeCharactersToString:string]; 
    else
        return string;
}

2

ওয়াল্টি ইয়েংয়ের উত্তরের এখানে একটি সুইফ্ট সংস্করণ রয়েছে :

extension String {
    static private let mappings = ["&quot;" : "\"","&amp;" : "&", "&lt;" : "<", "&gt;" : ">","&nbsp;" : " ","&iexcl;" : "¡","&cent;" : "¢","&pound;" : " £","&curren;" : "¤","&yen;" : "¥","&brvbar;" : "¦","&sect;" : "§","&uml;" : "¨","&copy;" : "©","&ordf;" : " ª","&laquo" : "«","&not" : "¬","&reg" : "®","&macr" : "¯","&deg" : "°","&plusmn" : "±","&sup2; " : "²","&sup3" : "³","&acute" : "´","&micro" : "µ","&para" : "¶","&middot" : "·","&cedil" : "¸","&sup1" : "¹","&ordm" : "º","&raquo" : "»&","frac14" : "¼","&frac12" : "½","&frac34" : "¾","&iquest" : "¿","&times" : "×","&divide" : "÷","&ETH" : "Ð","&eth" : "ð","&THORN" : "Þ","&thorn" : "þ","&AElig" : "Æ","&aelig" : "æ","&OElig" : "Œ","&oelig" : "œ","&Aring" : "Å","&Oslash" : "Ø","&Ccedil" : "Ç","&ccedil" : "ç","&szlig" : "ß","&Ntilde;" : "Ñ","&ntilde;":"ñ",]

    func stringByDecodingXMLEntities() -> String {

        guard let _ = self.rangeOfString("&", options: [.LiteralSearch]) else {
            return self
        }

        var result = ""

        let scanner = NSScanner(string: self)
        scanner.charactersToBeSkipped = nil

        let boundaryCharacterSet = NSCharacterSet(charactersInString: " \t\n\r;")

        repeat {
            var nonEntityString: NSString? = nil

            if scanner.scanUpToString("&", intoString: &nonEntityString) {
                if let s = nonEntityString as? String {
                    result.appendContentsOf(s)
                }
            }

            if scanner.atEnd {
                break
            }

            var didBreak = false
            for (k,v) in String.mappings {
                if scanner.scanString(k, intoString: nil) {
                    result.appendContentsOf(v)
                    didBreak = true
                    break
                }
            }

            if !didBreak {

                if scanner.scanString("&#", intoString: nil) {

                    var gotNumber = false
                    var charCodeUInt: UInt32 = 0
                    var charCodeInt: Int32 = -1
                    var xForHex: NSString? = nil

                    if scanner.scanString("x", intoString: &xForHex) {
                        gotNumber = scanner.scanHexInt(&charCodeUInt)
                    }
                    else {
                        gotNumber = scanner.scanInt(&charCodeInt)
                    }

                    if gotNumber {
                        let newChar = String(format: "%C", (charCodeInt > -1) ? charCodeInt : charCodeUInt)
                        result.appendContentsOf(newChar)
                        scanner.scanString(";", intoString: nil)
                    }
                    else {
                        var unknownEntity: NSString? = nil
                        scanner.scanUpToCharactersFromSet(boundaryCharacterSet, intoString: &unknownEntity)
                        let h = xForHex ?? ""
                        let u = unknownEntity ?? ""
                        result.appendContentsOf("&#\(h)\(u)")
                    }
                }
                else {
                    scanner.scanString("&", intoString: nil)
                    result.appendContentsOf("&")
                }
            }

        } while (!scanner.atEnd)

        return result
    }
}

1

আসলে মাইকেল ওয়াটারফলের দুর্দান্ত এমডাব্লুফিডপার্সার কাঠামো (তার উত্তর উল্লেখ করা হয়েছে) আরএমচারা দ্বারা তৈরি করা হয়েছে যারা এআরসি সহায়তায় এটি আপডেট করেছে!

আপনি গিটহাব এটা জানতে পারেন এখানে

এটি সত্যিই দুর্দান্ত কাজ করে, আমি স্ট্রিংবাইডকোডিং এইচটিএমলেটিটিস পদ্ধতি ব্যবহার করেছি এবং নির্দোষভাবে কাজ করি।


এটি এআরসি সংক্রান্ত সমস্যাগুলি স্থির করে - তবে কিছু সতর্কবার্তা প্রবর্তন করে। আমি তাদের এড়ানো নিরাপদ মনে করি?
রবার্ট জে Clegg

0

যেন আপনার আর একটি সমাধান দরকার! এটি একটি খুব সহজ এবং বেশ কার্যকর:

@interface NSString (NSStringCategory)
- (NSString *) stringByReplacingISO8859Codes;
@end


@implementation NSString (NSStringCategory)
- (NSString *) stringByReplacingISO8859Codes
{
    NSString *dataString = self;
    do {
        //*** See if string contains &# prefix
        NSRange range = [dataString rangeOfString: @"&#" options: NSRegularExpressionSearch];
        if (range.location == NSNotFound) {
            break;
        }
        //*** Get the next three charaters after the prefix
        NSString *isoHex = [dataString substringWithRange: NSMakeRange(range.location + 2, 3)];
        //*** Create the full code for replacement
        NSString *isoString = [NSString stringWithFormat: @"&#%@;", isoHex];
        //*** Convert to decimal integer
        unsigned decimal = 0;
        NSScanner *scanner = [NSScanner scannerWithString: [NSString stringWithFormat: @"0%@", isoHex]];
        [scanner scanHexInt: &decimal];
        //*** Use decimal code to get unicode character
        NSString *unicode = [NSString stringWithFormat:@"%C", decimal];
        //*** Replace all occurences of this code in the string
        dataString = [dataString stringByReplacingOccurrencesOfString: isoString withString: unicode];
    } while (TRUE); //*** Loop until we hit the NSNotFound

    return dataString;
}
@end

0

আপনার যদি স্ট্রিং হিসাবে ক্যারেক্টার সত্তা রেফারেন্স থাকে, উদাহরণস্বরূপ @"2318", আপনি সঠিক ইউনিকোড অক্ষর ব্যবহার করে একটি পুনরায় সংযুক্ত এনএসএস স্ট্রিং বের করতে পারেন strtoul;

NSString *unicodePoint = @"2318"
unichar iconChar = (unichar) strtoul(unicodePoint.UTF8String, NULL, 16);
NSString *recoded = [NSString stringWithFormat:@"%C", iconChar];
NSLog(@"recoded: %@", recoded");
// prints out "recoded: ⌘"

0

যুগলের উত্তরের সুইফ্ট 3 সংস্করণ

extension String {
    static private let mappings = ["&quot;" : "\"","&amp;" : "&", "&lt;" : "<", "&gt;" : ">","&nbsp;" : " ","&iexcl;" : "¡","&cent;" : "¢","&pound;" : " £","&curren;" : "¤","&yen;" : "¥","&brvbar;" : "¦","&sect;" : "§","&uml;" : "¨","&copy;" : "©","&ordf;" : " ª","&laquo" : "«","&not" : "¬","&reg" : "®","&macr" : "¯","&deg" : "°","&plusmn" : "±","&sup2; " : "²","&sup3" : "³","&acute" : "´","&micro" : "µ","&para" : "¶","&middot" : "·","&cedil" : "¸","&sup1" : "¹","&ordm" : "º","&raquo" : "»&","frac14" : "¼","&frac12" : "½","&frac34" : "¾","&iquest" : "¿","&times" : "×","&divide" : "÷","&ETH" : "Ð","&eth" : "ð","&THORN" : "Þ","&thorn" : "þ","&AElig" : "Æ","&aelig" : "æ","&OElig" : "Œ","&oelig" : "œ","&Aring" : "Å","&Oslash" : "Ø","&Ccedil" : "Ç","&ccedil" : "ç","&szlig" : "ß","&Ntilde;" : "Ñ","&ntilde;":"ñ",]

    func stringByDecodingXMLEntities() -> String {

        guard let _ = self.range(of: "&", options: [.literal]) else {
            return self
        }

        var result = ""

        let scanner = Scanner(string: self)
        scanner.charactersToBeSkipped = nil

        let boundaryCharacterSet = CharacterSet(charactersIn: " \t\n\r;")

        repeat {
            var nonEntityString: NSString? = nil

            if scanner.scanUpTo("&", into: &nonEntityString) {
                if let s = nonEntityString as? String {
                    result.append(s)
                }
            }

            if scanner.isAtEnd {
                break
            }

            var didBreak = false
            for (k,v) in String.mappings {
                if scanner.scanString(k, into: nil) {
                    result.append(v)
                    didBreak = true
                    break
                }
            }

            if !didBreak {

                if scanner.scanString("&#", into: nil) {

                    var gotNumber = false
                    var charCodeUInt: UInt32 = 0
                    var charCodeInt: Int32 = -1
                    var xForHex: NSString? = nil

                    if scanner.scanString("x", into: &xForHex) {
                        gotNumber = scanner.scanHexInt32(&charCodeUInt)
                    }
                    else {
                        gotNumber = scanner.scanInt32(&charCodeInt)
                    }

                    if gotNumber {
                        let newChar = String(format: "%C", (charCodeInt > -1) ? charCodeInt : charCodeUInt)
                        result.append(newChar)
                        scanner.scanString(";", into: nil)
                    }
                    else {
                        var unknownEntity: NSString? = nil
                        scanner.scanUpToCharacters(from: boundaryCharacterSet, into: &unknownEntity)
                        let h = xForHex ?? ""
                        let u = unknownEntity ?? ""
                        result.append("&#\(h)\(u)")
                    }
                }
                else {
                    scanner.scanString("&", into: nil)
                    result.append("&")
                }
            }

        } while (!scanner.isAtEnd)

        return result
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.