public static StringBuffer ConvertIDNToASCII(String src, IDNA2003Options options) { char[] srcArr = src.ToCharArray(); StringBuffer result = new StringBuffer(); int sepIndex = 0; int oldSepIndex = 0; for (; ;) { sepIndex = GetSeparatorIndex(srcArr, sepIndex, srcArr.Length); String label = new String(srcArr, oldSepIndex, sepIndex - oldSepIndex); //make sure this is not a root label separator. if (!(label.Length == 0 && sepIndex == srcArr.Length)) { UCharacterIterator iter = UCharacterIterator.GetInstance(label); result.Append(ConvertToASCII(iter, options)); } if (sepIndex == srcArr.Length) { break; } // increment the sepIndex to skip past the separator sepIndex++; oldSepIndex = sepIndex; result.Append((char)FULL_STOP); } return(result); }
public static StringBuffer ConvertIDNToUnicode(String src, IDNA2003Options options) { char[] srcArr = src.ToCharArray(); StringBuffer result = new StringBuffer(); int sepIndex = 0; int oldSepIndex = 0; for (; ;) { sepIndex = GetSeparatorIndex(srcArr, sepIndex, srcArr.Length); String label = new String(srcArr, oldSepIndex, sepIndex - oldSepIndex); if (label.Length == 0 && sepIndex != srcArr.Length) { throw new StringPrepParseException("Found zero length lable after NamePrep.", StringPrepErrorType.ZeroLengthLabel); } UCharacterIterator iter = UCharacterIterator.GetInstance(label); result.Append(ConvertToUnicode(iter, options)); if (sepIndex == srcArr.Length) { break; } // increment the sepIndex to skip past the separator sepIndex++; oldSepIndex = sepIndex; result.Append((char)FULL_STOP); } return(result); }
public static int Compare(string s1, string s2, IDNA2003Options options) { StringBuffer s1Out = ConvertIDNToASCII(s1, options); StringBuffer s2Out = ConvertIDNToASCII(s2, options); return(CompareCaseInsensitiveASCII(s1Out, s2Out)); }
public static StringBuffer ConvertIDNToUnicode(String src, IDNA2003Options options) { char[] srcArr = src.ToCharArray(); StringBuffer result = new StringBuffer(); int sepIndex = 0; int oldSepIndex = 0; for (; ;) { sepIndex = GetSeparatorIndex(srcArr, sepIndex, srcArr.Length); string label = new string(srcArr, oldSepIndex, sepIndex - oldSepIndex); if (label.Length == 0 && sepIndex != srcArr.Length) { throw new StringPrepParseException("Found zero length lable after NamePrep.", StringPrepErrorType.ZeroLengthLabel); } UCharacterIterator iter = UCharacterIterator.GetInstance(label); result.Append(ConvertToUnicode(iter, options)); if (sepIndex == srcArr.Length) { break; } // Unlike the ToASCII operation we don't normalize the label separators result.Append(srcArr[sepIndex]); // increment the sepIndex to skip past the separator sepIndex++; oldSepIndex = sepIndex; } if (result.Length > MAX_DOMAIN_NAME_LENGTH) { throw new StringPrepParseException("The output exceed the max allowed length.", StringPrepErrorType.DomainNameTooLongError); } return(result); }
public static StringBuffer ConvertIDNToASCII(string src, IDNA2003Options options) { char[] srcArr = src.ToCharArray(); StringBuffer result = new StringBuffer(); int sepIndex = 0; int oldSepIndex = 0; for (; ;) { sepIndex = GetSeparatorIndex(srcArr, sepIndex, srcArr.Length); string label = new string(srcArr, oldSepIndex, sepIndex - oldSepIndex); //make sure this is not a root label separator. if (!(label.Length == 0 && sepIndex == srcArr.Length)) { UCharacterIterator iter = UCharacterIterator.GetInstance(label); result.Append(ConvertToASCII(iter, options)); } if (sepIndex == srcArr.Length) { break; } // increment the sepIndex to skip past the separator sepIndex++; oldSepIndex = sepIndex; result.Append((char)FULL_STOP); } if (result.Length > MAX_DOMAIN_NAME_LENGTH) { throw new StringPrepParseException("The output exceed the max allowed length.", StringPrepErrorType.DomainNameTooLongError); } return(result); }
// TODO: optimize public static int Compare(UCharacterIterator i1, UCharacterIterator i2, IDNA2003Options options) { if (i1 == null || i2 == null) { throw new ArgumentException("One of the source buffers is null"); } StringBuffer s1Out = ConvertIDNToASCII(i1.GetText(), options); StringBuffer s2Out = ConvertIDNToASCII(i2.GetText(), options); return(CompareCaseInsensitiveASCII(s1Out, s2Out)); }
// TODO: optimize public static int Compare(String s1, String s2, IDNA2003Options options) { if (s1 == null || s2 == null) { throw new ArgumentException("One of the source buffers is null"); } StringBuffer s1Out = ConvertIDNToASCII(s1, options); StringBuffer s2Out = ConvertIDNToASCII(s2, options); return(CompareCaseInsensitiveASCII(s1Out, s2Out)); }
public static StringBuffer ConvertIDNToUnicode(StringBuffer str, IDNA2003Options options) { return(ConvertIDNToUnicode(str.ToString(), options)); }
public static StringBuffer ConvertIDNToUnicode(UCharacterIterator iter, IDNA2003Options options) { return(ConvertIDNToUnicode(iter.GetText(), options)); }
public static StringBuffer ConvertToUnicode(UCharacterIterator iter, IDNA2003Options options) { // the source contains all ascii codepoints bool srcIsASCII = true; int ch; int saveIndex = iter.Index; // step 1: find out if all the codepoints in src are ASCII while ((ch = iter.Next()) != UCharacterIterator.DONE) { if (ch > 0x7F) { srcIsASCII = false; break; } } // The RFC states that // <quote> // ToUnicode never fails. If any step fails, then the original input // is returned immediately in that step. // </quote> do { StringBuffer processOut; if (srcIsASCII == false) { // step 2: process the string iter.Index = (saveIndex); try { processOut = transform.Prepare(iter, (StringPrepOptions)options); } catch (StringPrepParseException e) { break; } } else { // just point to source processOut = new StringBuffer(iter.GetText()); } // step 3: verify ACE Prefix if (StartsWithPrefix(processOut)) { // step 4: Remove the ACE Prefix String temp = processOut.ToString(ACE_PREFIX_LENGTH, processOut.Length - ACE_PREFIX_LENGTH); // step 5: Decode using punycode StringBuffer decodeOut = null; try { decodeOut = PunycodeReference.Decode(new StringBuffer(temp), null); } catch (StringPrepParseException e) { break; } // step 6:Apply toASCII StringBuffer toASCIIOut = ConvertToASCII(decodeOut, options); // step 7: verify if (CompareCaseInsensitiveASCII(processOut, toASCIIOut) != 0) { break; } // step 8: return output of step 5 return(decodeOut); } } while (false); return(new StringBuffer(iter.GetText())); }
public static StringBuffer ConvertToUnicode(StringBuffer src, IDNA2003Options options) { UCharacterIterator iter = UCharacterIterator.GetInstance(src); return(ConvertToUnicode(iter, options)); }
public static StringBuffer ConvertIDNtoASCII(StringBuffer str, IDNA2003Options options) { return(ConvertIDNToASCII(str.ToString(), options)); }
public static StringBuffer ConvertToASCII(UCharacterIterator srcIter, IDNA2003Options options) { char[] caseFlags = null; // the source contains all ascii codepoints bool srcIsASCII = true; // assume the source contains all LDH codepoints bool srcIsLDH = true; //get the options bool useSTD3ASCIIRules = ((options & USE_STD3_RULES) != 0); int ch; // step 1 while ((ch = srcIter.Next()) != UCharacterIterator.DONE) { if (ch > 0x7f) { srcIsASCII = false; } } int failPos = -1; srcIter.SetToStart(); StringBuffer processOut = null; // step 2 is performed only if the source contains non ASCII if (!srcIsASCII) { // step 2 processOut = transform.Prepare(srcIter, (StringPrepOptions)options); } else { processOut = new StringBuffer(srcIter.GetText()); } int poLen = processOut.Length; if (poLen == 0) { throw new StringPrepParseException("Found zero length lable after NamePrep.", StringPrepErrorType.ZeroLengthLabel); } StringBuffer dest = new StringBuffer(); // reset the variable to verify if output of prepare is ASCII or not srcIsASCII = true; // step 3 & 4 for (int j = 0; j < poLen; j++) { ch = processOut[j]; if (ch > 0x7F) { srcIsASCII = false; } else if (IsLDHChar(ch) == false) { // here we do not assemble surrogates // since we know that LDH code points // are in the ASCII range only srcIsLDH = false; failPos = j; } } if (useSTD3ASCIIRules == true) { // verify 3a and 3b if (srcIsLDH == false || /* source contains some non-LDH characters */ processOut[0] == HYPHEN || processOut[processOut.Length - 1] == HYPHEN) { /* populate the parseError struct */ if (srcIsLDH == false) { throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules", StringPrepErrorType.STD3ASCIIRulesError, processOut.ToString(), (failPos > 0) ? (failPos - 1) : failPos); } else if (processOut[0] == HYPHEN) { throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules", StringPrepErrorType.STD3ASCIIRulesError, processOut.ToString(), 0); } else { throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules", StringPrepErrorType.STD3ASCIIRulesError, processOut.ToString(), (poLen > 0) ? poLen - 1 : poLen); } } } if (srcIsASCII) { dest = processOut; } else { // step 5 : verify the sequence does not begin with ACE prefix if (!StartsWithPrefix(processOut)) { //step 6: encode the sequence with punycode StringBuffer punyout = PunycodeReference.Encode(processOut, caseFlags); // convert all codepoints to lower case ASCII StringBuffer lowerOut = ToASCIILower(punyout); //Step 7: prepend the ACE prefix dest.Append(ACE_PREFIX, 0, ACE_PREFIX_LENGTH - 0); // ICU4N: Checked 3rd parameter //Step 6: copy the contents in b2 into dest dest.Append(lowerOut); } else { throw new StringPrepParseException("The input does not start with the ACE Prefix.", StringPrepErrorType.AcePrefixError, processOut.ToString(), 0); } } if (dest.Length > MAX_LABEL_LENGTH) { throw new StringPrepParseException("The labels in the input are too long. Length > 64.", StringPrepErrorType.LabelTooLongError, dest.ToString(), 0); } return(dest); }
public static StringBuffer ConvertToUnicode(UCharacterIterator src, IDNA2003Options options) { bool[] caseFlags = null; // the source contains all ascii codepoints bool srcIsASCII = true; // assume the source contains all LDH codepoints //bool srcIsLDH = true; //get the options //bool useSTD3ASCIIRules = ((options & USE_STD3_RULES) != 0); //int failPos = -1; int ch; int saveIndex = src.Index; // step 1: find out if all the codepoints in src are ASCII while ((ch = src.Next()) != UCharacterIterator.DONE) { if (ch > 0x7F) { srcIsASCII = false; }/*else if((srcIsLDH = isLDHChar(ch))==false){ * failPos = src.getIndex(); * }*/ } StringBuffer processOut; if (srcIsASCII == false) { try { // step 2: process the string src.Index = saveIndex; processOut = namePrep.Prepare(src, (StringPrepOptions)options); } catch (StringPrepParseException ex) { return(new StringBuffer(src.GetText())); } } else { //just point to source processOut = new StringBuffer(src.GetText()); } // TODO: // The RFC states that // <quote> // ToUnicode never fails. If any step fails, then the original input // is returned immediately in that step. // </quote> //step 3: verify ACE Prefix if (StartsWithPrefix(processOut)) { StringBuffer decodeOut = null; //step 4: Remove the ACE Prefix string temp = processOut.ToString(ACE_PREFIX.Length, processOut.Length - ACE_PREFIX.Length); //step 5: Decode using punycode try { decodeOut = new StringBuffer(Punycode.Decode(temp, caseFlags).ToString()); } catch (StringPrepParseException e) { decodeOut = null; } //step 6:Apply toASCII if (decodeOut != null) { StringBuffer toASCIIOut = ConvertToASCII(UCharacterIterator.GetInstance(decodeOut), options); //step 7: verify if (CompareCaseInsensitiveASCII(processOut, toASCIIOut) != 0) { // throw new StringPrepParseException("The verification step prescribed by the RFC 3491 failed", // StringPrepParseException.VERIFICATION_ERROR); decodeOut = null; } } //step 8: return output of step 5 if (decodeOut != null) { return(decodeOut); } } // }else{ // // verify that STD3 ASCII rules are satisfied // if(useSTD3ASCIIRules == true){ // if( srcIsLDH == false /* source contains some non-LDH characters */ // || processOut.charAt(0) == HYPHEN // || processOut.charAt(processOut.Length-1) == HYPHEN){ // // if(srcIsLDH==false){ // throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules", // StringPrepParseException.STD3_ASCII_RULES_ERROR,processOut.toString(), // (failPos>0) ? (failPos-1) : failPos); // }else if(processOut.charAt(0) == HYPHEN){ // throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules", // StringPrepParseException.STD3_ASCII_RULES_ERROR, // processOut.toString(),0); // // }else{ // throw new StringPrepParseException("The input does not conform to the STD 3 ASCII rules", // StringPrepParseException.STD3_ASCII_RULES_ERROR, // processOut.toString(), // processOut.Length); // // } // } // } // // just return the source // return new StringBuffer(src.getText()); // } return(new StringBuffer(src.GetText())); }
private void DoTestIDNToASCII(String src, String expected, IDNA2003Options options, Object expectedException) { if (!IDNAReference.IsReady) { Logln("Transliterator is not available on this environment. Skipping doTestIDNToASCII."); return; } StringBuffer inBuf = new StringBuffer(src); UCharacterIterator inIter = UCharacterIterator.GetInstance(src); try { StringBuffer @out = IDNAReference.ConvertIDNToASCII(src, options); if (expected != null && @out != null && [email protected]().Equals(expected)) { Errln("convertToIDNAReferenceASCII did not return expected result with options : " + options + " Expected: " + expected + " Got: " + @out); } if (expectedException != null && !unassignedException.Equals(expectedException)) { Errln("convertToIDNAReferenceASCII did not get the expected exception. The operation succeeded!"); } } catch (StringPrepParseException ex) { if (expectedException == null || !ex.Equals(expectedException)) { Errln("convertToIDNAReferenceASCII did not get the expected exception for source: " + src + " Got: " + ex.ToString()); } } try { StringBuffer @out = IDNAReference.ConvertIDNtoASCII(inBuf, options); if (expected != null && @out != null && [email protected]().Equals(expected)) { Errln("convertToIDNAReferenceASCII did not return expected result with options : " + options + " Expected: " + expected + " Got: " + @out); } if (expectedException != null && !unassignedException.Equals(expectedException)) { Errln("convertToIDNAReferenceSCII did not get the expected exception. The operation succeeded!"); } } catch (StringPrepParseException ex) { if (expectedException == null || !ex.Equals(expectedException)) { Errln("convertToIDNAReferenceSCII did not get the expected exception for source: " + src + " Got: " + ex.ToString()); } } try { StringBuffer @out = IDNAReference.ConvertIDNtoASCII(inIter, options); if (expected != null && @out != null && [email protected]().Equals(expected)) { Errln("convertIDNToASCII did not return expected result with options : " + options + " Expected: " + expected + " Got: " + @out); } if (expectedException != null && !unassignedException.Equals(expectedException)) { Errln("convertIDNToASCII did not get the expected exception. The operation succeeded!"); } } catch (StringPrepParseException ex) { if (expectedException == null || !ex.Equals(expectedException)) { Errln("convertIDNToASCII did not get the expected exception for source: " + src + " Got: " + ex.ToString()); } } }