The correct way to work with data coming from a substrate node is to use a tool or library that uses the Metadata to decode rpc responses correctly, as shown here: https://docs.substrate.io/v3/runtime/metadata/
Virtually everything you get from a substrate node over RPC will be SCALE encoded - SCALE requires that you have knowledge of the types in the data that you are working before trying to decode it. There are implementations available in many languages but it is probably better to use something that handles the process of getting the Metadata for you as well as described previously.
Regarding the specific types you were asking about: an unchecked extrinsic is an extrinsic with all of the extra data required to verify it's validity still included in it - as you can see for example in the subxt codebase here, the general format is:
extra signed data,
where the contents of the encoded data and extra signed data depend on the specific substrate chain you are working with.
an opaque extrinsic is the same thing, but the structure is not exposed to the code. It is simply a convention to specify a type as opaque if it's structure is not known or relevant at runtime.