Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 78781
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 10, 20262026-05-10T21:02:28+00:00 2026-05-10T21:02:28+00:00

I need to convert the punycode NIATO-OTABD to nñiñatoñ . I found a text

  • 0

I need to convert the punycode NIATO-OTABD to nñiñatoñ.

I found a text converter in JavaScript the other day, but the punycode conversion doesn’t work if there’s a dash in the middle.

Any suggestion to fix the ‘dash’ issue?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. 2026-05-10T21:02:29+00:00Added an answer on May 10, 2026 at 9:02 pm

    I took the time to create the punycode below. It it based on the C code in RFC 3492. To use it with domain names you have to remove/add xn-- from/to the input/output to/from decode/encode.

    The utf16-class is necessary to convert from JavaScripts internal character representation to unicode and back.

    There are also ToASCII and ToUnicode functions to make it easier to convert between puny-coded IDN and ASCII.

    //Javascript Punycode converter derived from example in RFC3492. //This implementation is created by some@domain.name and released into public domain var punycode = new function Punycode() {     // This object converts to and from puny-code used in IDN     //     // punycode.ToASCII ( domain )     //      // Returns a puny coded representation of 'domain'.     // It only converts the part of the domain name that     // has non ASCII characters. I.e. it dosent matter if     // you call it with a domain that already is in ASCII.     //     // punycode.ToUnicode (domain)     //     // Converts a puny-coded domain name to unicode.     // It only converts the puny-coded parts of the domain name.     // I.e. it dosent matter if you call it on a string     // that already has been converted to unicode.     //     //     this.utf16 = {         // The utf16-class is necessary to convert from javascripts internal character representation to unicode and back.         decode:function(input){             var output = [], i=0, len=input.length,value,extra;             while (i < len) {                 value = input.charCodeAt(i++);                 if ((value & 0xF800) === 0xD800) {                     extra = input.charCodeAt(i++);                     if ( ((value & 0xFC00) !== 0xD800) || ((extra & 0xFC00) !== 0xDC00) ) {                         throw new RangeError('UTF-16(decode): Illegal UTF-16 sequence');                     }                     value = ((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000;                 }                 output.push(value);             }             return output;         },         encode:function(input){             var output = [], i=0, len=input.length,value;             while (i < len) {                 value = input[i++];                 if ( (value & 0xF800) === 0xD800 ) {                     throw new RangeError('UTF-16(encode): Illegal UTF-16 value');                 }                 if (value > 0xFFFF) {                     value -= 0x10000;                     output.push(String.fromCharCode(((value >>>10) & 0x3FF) | 0xD800));                     value = 0xDC00 | (value & 0x3FF);                 }                 output.push(String.fromCharCode(value));             }             return output.join('');         }     }      //Default parameters     var initial_n = 0x80;     var initial_bias = 72;     var delimiter = '\x2D';     var base = 36;     var damp = 700;     var tmin=1;     var tmax=26;     var skew=38;     var maxint = 0x7FFFFFFF;      // decode_digit(cp) returns the numeric value of a basic code      // point (for use in representing integers) in the range 0 to     // base-1, or base if cp is does not represent a value.      function decode_digit(cp) {         return cp - 48 < 10 ? cp - 22 : cp - 65 < 26 ? cp - 65 : cp - 97 < 26 ? cp - 97 : base;     }      // encode_digit(d,flag) returns the basic code point whose value     // (when used for representing integers) is d, which needs to be in     // the range 0 to base-1. The lowercase form is used unless flag is     // nonzero, in which case the uppercase form is used. The behavior     // is undefined if flag is nonzero and digit d has no uppercase form.       function encode_digit(d, flag) {         return d + 22 + 75 * (d < 26) - ((flag != 0) << 5);         //  0..25 map to ASCII a..z or A..Z          // 26..35 map to ASCII 0..9     }     //** Bias adaptation function **     function adapt(delta, numpoints, firsttime ) {         var k;         delta = firsttime ? Math.floor(delta / damp) : (delta >> 1);         delta += Math.floor(delta / numpoints);          for (k = 0; delta > (((base - tmin) * tmax) >> 1); k += base) {                 delta = Math.floor(delta / ( base - tmin ));         }         return Math.floor(k + (base - tmin + 1) * delta / (delta + skew));     }      // encode_basic(bcp,flag) forces a basic code point to lowercase if flag is zero,     // uppercase if flag is nonzero, and returns the resulting code point.     // The code point is unchanged if it is caseless.     // The behavior is undefined if bcp is not a basic code point.      function encode_basic(bcp, flag) {         bcp -= (bcp - 97 < 26) << 5;         return bcp + ((!flag && (bcp - 65 < 26)) << 5);     }      // Main decode     this.decode=function(input,preserveCase) {         // Dont use utf16         var output=[];         var case_flags=[];         var input_length = input.length;          var n, out, i, bias, basic, j, ic, oldi, w, k, digit, t, len;          // Initialize the state:           n = initial_n;         i = 0;         bias = initial_bias;          // Handle the basic code points: Let basic be the number of input code          // points before the last delimiter, or 0 if there is none, then         // copy the first basic code points to the output.          basic = input.lastIndexOf(delimiter);         if (basic < 0) basic = 0;          for (j = 0; j < basic; ++j) {             if(preserveCase) case_flags[output.length] = ( input.charCodeAt(j) -65 < 26);             if ( input.charCodeAt(j) >= 0x80) {                 throw new RangeError('Illegal input >= 0x80');             }             output.push( input.charCodeAt(j) );         }          // Main decoding loop: Start just after the last delimiter if any         // basic code points were copied; start at the beginning otherwise.           for (ic = basic > 0 ? basic + 1 : 0; ic < input_length; ) {              // ic is the index of the next character to be consumed,              // Decode a generalized variable-length integer into delta,             // which gets added to i. The overflow checking is easier             // if we increase i as we go, then subtract off its starting              // value at the end to obtain delta.             for (oldi = i, w = 1, k = base; ; k += base) {                     if (ic >= input_length) {                         throw RangeError ('punycode_bad_input(1)');                     }                     digit = decode_digit(input.charCodeAt(ic++));                      if (digit >= base) {                         throw RangeError('punycode_bad_input(2)');                     }                     if (digit > Math.floor((maxint - i) / w)) {                         throw RangeError ('punycode_overflow(1)');                     }                     i += digit * w;                     t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias;                     if (digit < t) { break; }                     if (w > Math.floor(maxint / (base - t))) {                         throw RangeError('punycode_overflow(2)');                     }                     w *= (base - t);             }              out = output.length + 1;             bias = adapt(i - oldi, out, oldi === 0);              // i was supposed to wrap around from out to 0,             // incrementing n each time, so we'll fix that now:              if ( Math.floor(i / out) > maxint - n) {                 throw RangeError('punycode_overflow(3)');             }             n += Math.floor( i / out ) ;             i %= out;              // Insert n at position i of the output:              // Case of last character determines uppercase flag:              if (preserveCase) { case_flags.splice(i, 0, input.charCodeAt(ic -1) -65 < 26);}              output.splice(i, 0, n);             i++;         }         if (preserveCase) {             for (i = 0, len = output.length; i < len; i++) {                 if (case_flags[i]) {                     output[i] = (String.fromCharCode(output[i]).toUpperCase()).charCodeAt(0);                 }             }         }         return this.utf16.encode(output);     };      //** Main encode function **      this.encode = function (input,preserveCase) {         //** Bias adaptation function **          var n, delta, h, b, bias, j, m, q, k, t, ijv, case_flags;          if (preserveCase) {             // Preserve case, step1 of 2: Get a list of the unaltered string             case_flags = this.utf16.decode(input);         }         // Converts the input in UTF-16 to Unicode         input = this.utf16.decode(input.toLowerCase());          var input_length = input.length; // Cache the length          if (preserveCase) {             // Preserve case, step2 of 2: Modify the list to true/false             for (j=0; j < input_length; j++) {                 case_flags[j] = input[j] != case_flags[j];             }         }          var output=[];           // Initialize the state:          n = initial_n;         delta = 0;         bias = initial_bias;          // Handle the basic code points:          for (j = 0; j < input_length; ++j) {             if ( input[j] < 0x80) {                 output.push(                     String.fromCharCode(                         case_flags ? encode_basic(input[j], case_flags[j]) : input[j]                     )                 );             }         }          h = b = output.length;          // h is the number of code points that have been handled, b is the         // number of basic code points           if (b > 0) output.push(delimiter);          // Main encoding loop:          //         while (h < input_length) {             // All non-basic code points < n have been             // handled already. Find the next larger one:               for (m = maxint, j = 0; j < input_length; ++j) {                 ijv = input[j];                 if (ijv >= n && ijv < m) m = ijv;             }              // Increase delta enough to advance the decoder's             // <n,i> state to <m,0>, but guard against overflow:               if (m - n > Math.floor((maxint - delta) / (h + 1))) {                 throw RangeError('punycode_overflow (1)');             }             delta += (m - n) * (h + 1);             n = m;              for (j = 0; j < input_length; ++j) {                 ijv = input[j];                  if (ijv < n ) {                     if (++delta > maxint) return Error('punycode_overflow(2)');                 }                  if (ijv == n) {                     // Represent delta as a generalized variable-length integer:                      for (q = delta, k = base; ; k += base) {                         t = k <= bias ? tmin : k >= bias + tmax ? tmax : k - bias;                         if (q < t) break;                         output.push( String.fromCharCode(encode_digit(t + (q - t) % (base - t), 0)) );                         q = Math.floor( (q - t) / (base - t) );                     }                     output.push( String.fromCharCode(encode_digit(q, preserveCase && case_flags[j] ? 1:0 )));                     bias = adapt(delta, h + 1, h == b);                     delta = 0;                     ++h;                 }             }              ++delta, ++n;         }         return output.join('');     }      this.ToASCII = function ( domain ) {         var domain_array = domain.split('.');         var out = [];         for (var i=0; i < domain_array.length; ++i) {             var s = domain_array[i];             out.push(                 s.match(/[^A-Za-z0-9-]/) ?                 'xn--' + punycode.encode(s) :                 s             );         }         return out.join('.');     }     this.ToUnicode = function ( domain ) {         var domain_array = domain.split('.');         var out = [];         for (var i=0; i < domain_array.length; ++i) {             var s = domain_array[i];             out.push(                 s.match(/^xn--/) ?                 punycode.decode(s.slice(4)) :                 s             );         }         return out.join('.');     } }();   // Example of usage: domain.oninput = function() {     var input = domain.value     var ascii = punycode.ToASCII(input)     var display = punycode.ToUnicode(ascii)     domain_ascii.value = ascii     domain_display.value = display }
    <p>Try with your own data</p>  <label>   <div>Input domain</div>   <div><input id='domain' type='text'></div> </label> <div>Ascii: <output id='domain_ascii'></div> <div>Display: <output id='domain_display'></div>

    Licence:

    From RFC3492:

    Disclaimer and license

    Regarding this entire document or any portion of it (including the pseudocode and C code), the author makes no guarantees and is not responsible for any damage resulting from its use. The author grants irrevocable permission to anyone to use, modify, and distribute it in any way that does not diminish the rights of anyone else to use, modify, and distribute it, provided that redistributed derivative works do not contain misleading author or version information. Derivative works need not be licensed under similar terms.

    I put my work in this punycode and utf16 in the public domain. It would be nice to get an email telling me in what project you use it.

    The scope of the code

    Each TLD has rules for which code points are allowed. The scope of the code below is to encode and decode a string between punycode and the internal encoding used by javascript regardes of those rules. Depending on your use case, you may need to filter the string. For example, 0xFE0F: Variation Selector-16, an invisible code point that specifies that the previous character should be displayed with emoji presentation. If you search for "allowed code points in IDN" you should find several projects that can help you filter the string.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have a string and need convert it to a date, but it doesn't
I need to convert a string of text containing a long url into the
I need to convert CString to BYTE array. I don't know why, but everything
need to convert a pdf file to a doc file. I found different type
I need to convert values like 1393443048683555715 to HEX. But, first of all, i
Need to convert a text value `2012-03-19' into a date type, then extract the
I need convert a String to a decimal in C#, but this string have
I need to convert date/time in a text file into number of minutes elapsed
I need to convert from a standard Gregorian date to a Julian day number.
i need to convert this query to C# LINQ but i have no idea

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.