cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

How to do the Encoding Conversion by using Groovy?

shin861231
Participant
0 Likes
914

Hello  Experts,

I am now trying to implement a script in SAP Integration Suite, Cloud Integration. (Used to be SAP CPI)

The scenario I am trying to realize is the encoding conversion between Shift_JIS and UTF-8. 

I am thinking that users can just specify "Convert From" and "Convert To", and the script will do the conversion.

 

Here's the code that I wrote. However, when I did the experiment, for some reason my original file was deleted and there's no new file generate.

Could someone kindly help with how I can write the script?

import com.sap.gateway.ip.core.customdev.util.Message
import java.nio.charset.StandardCharsets
import java.nio.charset.Charset

def Message processData(Message message) {
    // User-editable variables
    def convertFrom = "UTF-8"  // Set this to either "UTF-8" or "Shift_JIS"
    def convertTo = "Shift_JIS"  // Set this to either "UTF-8" or "Shift_JIS"

    println("Starting charset conversion from ${convertFrom} to ${convertTo}")

    // Validate and normalize charset names
    convertFrom = normalizeCharsetName(convertFrom)
    convertTo = normalizeCharsetName(convertTo)
    
    // Get the body as a byte array to preserve the original encoding
    def bodyBytes = message.getBody(byte[])
    println("Original body size: ${bodyBytes.length} bytes")
    
    // Perform the conversion
    def convertedBytes = convertCharset(bodyBytes, convertFrom, convertTo)
    println("Converted body size: ${convertedBytes.length} bytes")
    
    // Set the converted byte array as the new body
    message.setBody(convertedBytes)
    
    // Set the output charset
    message.setProperty("CamelCharsetName", convertTo)
    
    println("Conversion complete. Headers: ${message.getHeaders()}")
    
    return message
}

def String normalizeCharsetName(String charset) {
    switch (charset.toLowerCase()) {
        case "utf-8": return "UTF-8"
        case "utf8": return "UTF-8"
        case "shift-jis": return "Shift_JIS"
        case "shift_jis": return "Shift_JIS"
        case "shiftjis": return "Shift_JIS"
        case "sjis": return "Shift_JIS"
        default: 
            println("ERROR: Unsupported charset: ${charset}")
            throw new IllegalArgumentException("Unsupported charset: " + charset)
    }
}

def byte[] convertCharset(byte[] input, String fromCharset, String toCharset) {
    if (fromCharset == toCharset) {
        println("No conversion needed, charsets are the same")
        return input
    }
    
    try {
        Charset sourceCharset = Charset.forName(fromCharset)
        Charset targetCharset = Charset.forName(toCharset)
        
        String decodedString = new String(input, sourceCharset)
        byte[] result = decodedString.getBytes(targetCharset)
        
        println("Conversion successful: ${fromCharset} to ${toCharset}")
        return result
    } catch (Exception e) {
        println("ERROR: Error during conversion: ${e.message}")
        throw new RuntimeException("Error during charset conversion", e)
    }
}

 

Thank you.

 

 

 

Accepted Solutions (0)

Answers (0)