Special Characters utf8-bom with the API

SOLVED
bjowol
New here

Special Characters utf8-bom with the API

after updating all the organization name with PowerShell and the API I noticed a formatting error.
Special Characters like øæå are replaced with squares.

 

Does anyone know what kind of little parameter i need to add in my code to make it support our nordic characters?

any help would be greatly appreciated.

1 ACCEPTED SOLUTION
BrechtSchamp
Kind of a big deal

It was this that finally did the trick I suppose, in combination with the correct charset setting?

 

$body = [System.Text.Encoding]::UTF8.GetBytes($json)

 

View solution in original post

9 REPLIES 9
BrechtSchamp
Kind of a big deal

Have you tried using URL encoding for those characters? The name parameter ends up as a param in the get URL so depending on how the script works this might be needed.

øæå = %C3%B8%C3%A6%C3%A5

 

Online converter if needed:

https://www.w3schools.com/tags/ref_urlencode.asp

$customuri = $org.samlConsumerUrl.Split('/')[2].split('.')[0]
$updateuri = 'https://{1}.meraki.com/api/v0/organizations/{0}' -f $org.id,$customuri
$parms = @{
name = $WantedName
}
$json = $parms | ConvertTo-Json
$change = Invoke-RestMethod -Method Put -Uri $updateuri -Body $json -Headers $header
$change

2019-02-01 09_01_48-● Update.Meraki.Org.Name.ps1 - Untitled (Workspace) - Visual Studio Code.png2019-02-01 09_02_38-Organization settings - Meraki Dashboard.png
 
Unfortunatly this did not work.
BrechtSchamp
Kind of a big deal

Hmm okay. Try changing this:

"Content-Type" = 'application/json'

To this:

"Content-Type" = 'application/json ; charset=utf-8'

 

thanks for your input.

this is my current header:

$header = @{
    'X-Cisco-Meraki-API-Key' = $apikey
    'Content-Type' = 'application/json ; charset=utf-8'
    'Accept-Language' = 'nb-NO,nb;q=0.9,no-NO;q=0.8,no;q=0.6,nn-NO;q=0.5,nn;q=0.4,en-US;q=0.3,en;q=0.1'
    
}

Ive also tried a few other charsets, like iso and sorts.

 

also tried this.

$header = @{
    'X-Cisco-Meraki-API-Key' = $apikey
    'Content-Type' = 'application/json'
    'Accept-Language' = 'nb-NO,nb;q=0.9,no-NO;q=0.8,no;q=0.6,nn-NO;q=0.5,nn;q=0.4,en-US;q=0.3,en;q=0.1'
    'Accept-Charset'=  'utf-8, iso-8859-1;q=0.5, *;q=0.1'
}
BrechtSchamp
Kind of a big deal

This worked for me:

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

$api_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

$header = @{
	
	"X-Cisco-Meraki-API-Key" = $api_key
	"Content-Type" = 'application/json ; charset=utf-8'
	
}

$api = @{

	"endpoint" = 'https://xxxx.meraki.com/api/v0'

}

$api.url = '/networks/xxxmy-network-idxxxx'
$uri = $api.endpoint + $api.url

$parms = @{
	name = 'My Network øæå'
}
$json = $parms | ConvertTo-Json
$change = Invoke-RestMethod -Method Put -Uri $uri -Body $json -Headers $header
$change

I set the encoding of the file to UTF-8 from Notepad++ and then ran it from powershell.

 

Maybe what Nick did here will also help:

 

system_encoding.PNG

Source: https://stackoverflow.com/questions/21598398/wrong-encoding-on-powershell-invoke-webrequest-post

i appreciate your responses. i tried them in both vscode(with all types of encoding) and in ISE.

 

i also tried this

            $change = Invoke-RestMethod -Method Put -Uri $updateuri -Body $json -Headers $header -ContentType "text/plain; charset=utf-8"
            $change

I have a support case open with meraki. ill see if they can come up with something.

 

i have not tried to do the same with a network name. cant think of any reasons why there would be a difference between network name and org name, but there might be.

found a solution based on your reply.

 

$header = @{
     "X-Cisco-Meraki-API-Key" = $apikey 
     "Content-Type" = 'application/json ; charset=utf-16' 
}

            $customuri = $org.samlConsumerUrl.Split('/')[2].split('.')[0]
            $updateuri = 'https://{1}.meraki.com/api/v0/organizations/{0}' -f $org.id,$customuri
            $parms = @{
                name = $WantedName
            }
            $json = $parms | ConvertTo-Json
            $body = [System.Text.Encoding]::UTF8.GetBytes($json)

            $change = Invoke-RestMethod -Method Put -Uri $updateuri -Body $body -Headers $header
            $change
BrechtSchamp
Kind of a big deal

It was this that finally did the trick I suppose, in combination with the correct charset setting?

 

$body = [System.Text.Encoding]::UTF8.GetBytes($json)

 

it was probably just that one-liner.

i tested with a bunch of different header parameters and running powershell in different charsets.

 

glad you pointed me to the solution though!


I believe it converts the data to bytes, and just sends the bytes, ignoring charsets or something.

Get notified when there are additional replies to this discussion.
Welcome to the Meraki Community!
To start contributing, simply sign in with your Cisco account. If you don't yet have a Cisco account, you can sign up.