Converting string containing decimal code to plain string - javascript

I am getting strings from an API endpoint like: Senol Güneş Spor Kompleksi. ş is a Turkish letter, ş. I want my string to be Senol Güneş Spor Kompleksi. I tried JSON.Parse and utf8 package without success. Can I parse this string to a plain string?

I solved the problem by using html-entities package.
const Entities = require('html-entities').AllHtmlEntities;
const entities = new Entities();
const decodedString = entities.decode(originalString);

Related

how to add comma after each object and convert into array in javascript react js

how can i add comma after each object and convert into array. here's my response data
{"url":"example.com/john","age":"32"}{"url":"example.com/mike","age":"42"}
i want this
[{"url":"example.com/john","age":"32"},{"url":"example.com/mike","age":"42"}]
i tried with regex but it's converting data into string but i want to render this data
How about a little bit of Regex magic to make it valid JSON.
const res = '{"url":"example.com/john","age":"32"}{"url":"example.com/mike","age":"42"}';
const betterJson = `[${res.replace(/}{/g,'},{')}]`;
console.log(JSON.parse(betterJson))

Converting a string to array in javascript without eval()

I want to implement a counter for unique articles visited in my website, basically storing the ids of the articles the user has visited in a cookie. My issue is that the recovered value is, of course, a string. How would you convert a string that looks like this "['test','b','c']" to an array? Using eval is not advised, right?
Use JSON.parse to turn a string into an array:
const string = '["test","b","c"]';
const arr = JSON.parse(string);
console.log(arr[0]);
Note that you need to have proper JSON formatting, though - keys and non-numeric values need to have double quotes. Easiest to serialize automatically with JSON.stringify:
const arr = ["test","b","c"];
const str = JSON.stringify(arr);
console.log(str);
If you absolutely cannot change the single-quotes in the string you're working with originally, then use replace to turn it into something parseable:
const str = "['test','b','c']";
const jsonFormattedStr = str.replace(/'/g, '"');
const arr = JSON.parse(jsonFormattedStr);
console.log(arr[1]);
While using JSON.parse() is the correct way to convert data strings to usable objects, the string in your question is not valid JSON syntax. Namely the single quotes will result in an unexpected token error.
If your only issue is the quotes, then it becomes trivial to prepare your data for parsing:
var str = "['test','b','c']"
// convert to double quotes
str = str.split('\'').join('"')
// now parse
var arr = JSON.parse(str)
console.log(arr)
You need to convert the quotes to double quotes, and then use JSON.parse
let string = "['test','b','c']";
// replace quotes with double quotes
let stringFixed = string.replace(/'/g, '"');
// parse the string
let result = JSON.parse( stringFixed );

How do JSON.parse() and escape characters work in JavaScript?

Suppose I have an object variable:
var obj = {
key: '\"Hello World\"'
}
Then I tried parse it to string by using JSON.stringify in Chrome devtools console:
JSON.stringify(obj) // "{"key":"\"Hello World\""}"
I get the result "{"key":"\"Hello World\""}". Then I give it to a string
var str = '{"key":"\"Hello World\""}'
At least I try to convert it back to obj:
JSON.parse(str);
but the browser tell me wrong Uncaught SyntaxError
What confused me is why this is wrong? I get the string from an origin object and I just want turn it back.
How can I fix this problem? If I want do the job like convert obj to string and return it back, how can I do?
You're tried to convert your JSON into a string literal by wrapping it in ' characters, but \ characters have special meaning inside JavaScript string literals and \" gets converted to " by the JavaScript parser before it reaches the JSON parser.
You need to escape the \ characters too.
var str = '{"key":"\\"Hello World\\""}'
That said, in general, it is better to not try to embed JSON in JavaScript string literals only to parse them with JSON.parse in the first place. JSON syntax is a subset of JavaScript so you can use it directly.
var result = {"key":"\"Hello World\""};
try:
var str = '{"key":"\\"Hello World\\""}';

CryptoJS not decrypting non-Latin characters faithfully

I am trying to use CryptoJS AES, like so:
var msg = "café";
var key = "something";
var c = CryptoJS.AES.encrypt(msg, key).toString();
CryptoJS.AES.decrypt(c, key).toString(CryptoJS.enc.Latin1);
Unfortunately this returns café, not café. Clearly Latin1 is not the right encoding to use, but I can't find a better one. Is there a solution?
Thanks.
You are just missing the format
The proper way is using CryptoJS.enc.Utf8
So, Please try:
CryptoJS.AES.decrypt(c, key).toString(CryptoJS.enc.Utf8);
https://code.google.com/p/crypto-js/#The_Hasher_Input
The hash algorithms accept either strings or instances of CryptoJS.lib.WordArray [...] an array of 32-bit words. When you pass a string, it's automatically converted to a WordArray encoded as UTF-8.
So, when you pass a string (and don't use CryptoJS.enc.* to generate a WordArray) it automatically converts the string (message) to a utf8 WordArray.
See here for sample roundtrip encrypt/decrypt:
https://code.google.com/p/crypto-js/#The_Cipher_Output
Here's a jsfiddle to play with CryptoJS
https://jsfiddle.net/8qbf4746/4/
var message = "café";
var key = "something";
var encrypted = CryptoJS.AES.encrypt(message, key);
//equivalent to CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(message), key);
var decrypted = CryptoJS.AES.decrypt(encrypted, key);
$('#1').text("Encrypted: "+encrypted);
$('#2').text("Decrypted: "+decrypted.toString(CryptoJS.enc.Utf8));
To emphasize my point here is the same thing using Latin1 encoding:
https://jsfiddle.net/3a8tf48f/2/
var message = "café";
var key = "something";
var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Latin1.parse(message), key);
var decrypted = CryptoJS.AES.decrypt(encrypted, key);
$('#1').text("Encrypted: " + encrypted);
$('#2').text("Decrypted: " + decrypted.toString(CryptoJS.enc.Latin1));
On a side note, the API would probably be better if it only accepted WordArray and didn't overload the toString method (which is just a convenience interface to CryptoJS.enc.*.stringify). The string conversion magic is a little misleading.
You are trying to decrypt your data as a Latin1 string, even though your input string is not in Latin1. The encoding used by CryptoJS internally is not the same as the encoding you use to write the input file.
You need to specify the same encoding both when encrypting (for the string -> byte array conversion) and when decrypting (for the byte array -> string conversion).

MD5.ComputeHash(Encoding.Unicode.GetBytes(value)) into javascript

I need to translate the line below from vb.net to javascript
MD5.ComputeHash(Encoding.Unicode.GetBytes(value))
Im trying to use CryptoJS but I get diffrent results as I need to pass a string into that but a byte array into the MD5 function in VB.net
Can anyone help?
Thank you
Encoding.Unicode is a (misleading) name used by Windows for the UTF-16LE encoding.
However the CryptoJS functions, when given a string, encode it to bytes using the (more common) UTF-8, not UTF-16LE:
The hash algorithms accept either strings or instances of CryptoJS.lib.WordArray. A WordArray object represents an array of 32-bit words. When you pass a string, it's automatically converted to a WordArray encoded as UTF-8.
So you will need to create a WordArray from the string yourself before passing it in to MD5. With a new enough CryptoJS there's a function to do that for you:
CryptoJS.MD5(CryptoJS.enc.Utf16LE.parse(str))
IN C#:
var data = md5.ComputeHash(Encoding.Default.GetBytes(password));
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++) {
stringBuilder.Append(data[i].ToString("x2"));
}
return stringBuilder.ToString();
In Node.js
const crypto = require('crypto');
crypto.createHash('md5').update(value).digest('hex');

Categories

Resources