The sample below tries to decipher the charset from the content-type header (if available). Most REST / SOAP APIs require that all POST and PUT requests have content-type header in which the charset is usually a component value. If your API doesn't require one, you may consider making that a requirement for POST and PUT operations.
Example
<cffunction name="performContentLengthChecks" access="private" returntype="false" output="false"
hint="Performs content-length header and body checks.">
<cfset var content = GetHttpRequestData().content />
<cfset var headers = GetHttpRequestData().headers />
<cfset var contentType = "" />
<cfset var charset = "ISO-8859-1" />
<cfif StructKeyExists(headers, "Content-Type")>
<cfset contentType = headers["ContentType"] />
<!--- Find a charset in example "application/xml; charset=UTF-8"--->
<cfif ListLen(contentType, ";") GTE 2>
<cfset charset = Trim(ListGetAt(ListGetAt(contentType, 2, ";"), 2, "=")) />
</cfif>
</cfif>
<!--- Check that the content-length header was sent --->
<cfif NOT StructKeyExists(headers, "Content-Length")>
<cfthrow type="MissingContentLength" />
<!--- Check that the number of bytes in the content-length header of the raw content equals the header value --->
<cfelseif headers["Content-Length"] NEQ Len(content.getBytes(charset))>
<cfthrow type="IncompleteBody" />
</cfif>
</cffunction>